The following snippets show various ways of configuring log4cxx.
Patterns
The basic way of outputing messages is by using a PatternLayout, and then sending the messages to stderr/stdout/file. The following examples show how you might configure the PatternLayout in order to achieve the results shown.
Each example has two blocks of code: the layout for the PatternLayout, and a sample output message.
Pattern 1
This pattern contains the date in an ISO-8601 format(without fractional seconds), followed by the logger name, the level, and then the message.
[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n
[2020-12-24 15:31:46] root INFO - Hello there!
Pattern 2
Similar to Pattern 1, except using ISO-8601 with fractional seconds
[2020-12-24 15:35:39,225] root INFO - Hello there!
Pattern 3
Prints out the number of milliseconds since the start of the application, followed by the level(5 character width), followed by the logger name (20 character width), followed by the message.
XML Files
One way of configuring log4cxx is with XML files. The following are some examples on various ways of using an XML file to configure the logging.
XML Example 1
This simple example simply writes messages to stdout. If you want to send messages to stderr instead, simply change the 'Target' value to System.err
.
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n"/>
</layout>
</appender>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender"/>
</root>
</log4j:configuration>
Sample output:
XML Example 2
This example sends data to both stdout, as well as to a file. In this case, the file will be in our working directory. The pattern has also been updated to match with pattern example 1
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n"/>
</layout>
</appender>
<appender name="FileAppender" class="org.apache.log4j.FileAppender">
<param name="file" value="example.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n" />
</layout>
</appender>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender"/>
</root>
</log4j:configuration>
Sample output:
[2020-12-24 15:57:35] root INFO - Hello there!
XML Example 3
This example shows how you can configure logging for a particular category.
Assume that our loggers are in our code as such:
For this configuration, we have set any logger that is at the com
level or below to be debug. However, we have also set the logger com.example
to have a more verbose trace
level to see more information from that particular logger.
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n"/>
</layout>
</appender>
<appender name="FileAppender" class="org.apache.log4j.FileAppender">
<param name="file" value="example.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n" />
</layout>
</appender>
<root>
<priority value="info" />
<appender-ref ref="ConsoleAppender"/>
<appender-ref ref="FileAppender"/>
</root>
<logger name="com" >
<priority value="debug"/>
</logger>
<logger name="com.example" >
<priority value="trace"/>
</logger>
</log4j:configuration>
Sample output:
[2020-12-24 16:05:48] root INFO - Hello there!
[2020-12-24 16:05:48] com DEBUG - com logger debug
[2020-12-24 16:05:48] com.example DEBUG - com.example debug message
[2020-12-24 16:05:48] com.example TRACE - com.example trace message
XML Example 4
This example shows how to add a filter to an appender that will accept messages that match a certain string. If our loggers are configured as such:
and we only want to see messages that have the string "specific" in them, we can create a filter chain that will accept messages that have that, and deny everything else:
<?xml version="1.0" encoding="UTF-8" ?>
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss}] %c %-5p - %m%n"/>
</layout>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch"
value="specific" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
<root>
<priority value="trace" />
<appender-ref ref="ConsoleAppender"/>
</root>
</log4j:configuration>
Sample output:
[2021-03-26 20:20:36] com.example DEBUG - A more specific logger
[2021-03-26 20:20:36] com.example TRACE - A very specific message
Note that even though we have the root logger set to the most verbose level(trace), the only messages that we saw were the ones with "specific" in them.