1

I have a log table in my database that keeps track of login, logout, timeout, and what the user does while they are logged on. My Java is set up so that every time I do LOGGER.info(message), the message goes into the MESSAGE column of my table.

Here is the log4j.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%-5p: %c - %m%n" />
    </layout>
</appender>
<appender name="db" class="org.apache.log4j.jdbcplus.JDBCAppender">
    <param name="connector" value="com.blahblahblah.jdbcplus.MySqlConnectionHandler" />
    <param name="sql"
    value="INSERT INTO LOG(LEVEL, MESSAGE, TIMESTAMP, HOST) VALUES ('@PRIO@', '@MSG@', '@TIMESTAMP@', 'Test')" />
    <layout class="org.apache.log4j.PatternLayout"></layout>
</appender>

<!-- Application Loggers -->
<logger name="com.blahblahblah.service.ZebraService">
    <level value="info" />
    <appender-ref ref="db" />
</logger>
<logger name="com.blahblahblah.service.ZplTemplateService">
    <level value="info" />
    <appender-ref ref="db" />
</logger>
<logger name="com.blahblahblah.service.MyService">
    <level value="info" />
    <appender-ref ref="db" />
</logger>
<logger name="com.blahblahblah.web.controller.ViewController">
    <level value="info" />
    <appender-ref ref="db" />
</logger>
<logger name="com.blahblahblah.security">
    <level value="info" />
    <appender-ref ref="db" />
</logger>

<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
    <level value="error" />
</logger>
<logger name="org.springframework.beans">
    <level value="error" />
</logger>
<logger name="org.springframework.context">
    <level value="error" />
</logger>
<logger name="org.springframework.web">
    <level value="error" />
</logger>
<logger name="org.springframework.web.servlet.DispatcherServlet">
    <level value="error" />
</logger>
<logger name="org.springframework.security">
    <level value="error" />
</logger>
<logger name="org.springframework.aop">
    <level value="error" />
</logger>
<logger name="org.springframework.ui">
    <level value="error" />
</logger>
<!-- Root Logger -->
<root >
    <priority value="error" />
    <appender-ref ref="console" />
</root>

This prints "INFO" in the LEVEL column, my information about login/logout in the MESSAGE column, the timestamp in the TIMESTAMP column, and "Test" in the HOST column.

I want to have the HOST column be the local machine name. For example, my computer's name is PC-1050, so every time I do something on that computer, I want HOST to say "PC-1050".

I have no idea how to do the @MSG@, @TIMESTAMP@, etc. I was just following what I was told to do. Can anyone offer some assistance? Thanks.

Pace
  • 41,875
  • 13
  • 113
  • 156
snowfi6916
  • 697
  • 4
  • 9
  • 21

1 Answers1

1

I did some research on log4j configuration for JDBCAppender and unfortunately did not see any easy way to do it (i.e. nothing along the lines of a simple change to the log4j.xml file) for Hostname.

I did not find anything for Hostname along the lines of

  • Priority @PRIO@
  • Message @MSG@
  • Timestamp @TIMESTAMP@

for your SQL of

INSERT INTO LOG(LEVEL, MESSAGE, TIMESTAMP, HOST) VALUES  
('@PRIO@', '@MSG@', '@TIMESTAMP@', 'Test')

Also, I did not see anything in log4j documentation on PatternLayout for Hostname. I woudl think that if there was a macro for it in log4j JDBCAppender, it would correspond to a conversion character in PatternLayout.

You could look at putting the Hostname into the MDC. Here is an example of someone else who uses log4j JDBCAppender and put the user into the MDC.

Good luck, hope this helps!

Community
  • 1
  • 1
Philip Tenn
  • 6,003
  • 8
  • 48
  • 85