The following snippets show various ways of configuring Log4cxx.
Default Initialization Behaviour
The Log4cxx library does not make any assumptions about its environment. In particular, when initially created the root Logger has no appender. However the library will attempt automatic configuration.
If the LoggerRepositoy is not yet configured on the first call to getLogger of LogManager, the configure method of DefaultConfigurator is called via ensureIsConfigured method of LoggerRepository.
To use automatic configuration with a non-standard file name create and use your own wrapper for getLogger. A full example can be seen in the com/foo/config3.cpp file.
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. With this configuration the "example.log" file will be created in our working directory.
<?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:
static LoggerPtr getLogger(const std::string &name)
Retrieve a logger by name in current encoding.
static LoggerPtr getRootLogger()
Retrieve the root logger.
#define LOG4CXX_INFO(logger, message)
Add a new logging event containing message to attached appender(s) if logger is enabled for INFO even...
Definition: log4cxx/logger.h:2307
#define LOG4CXX_TRACE(logger, message)
Add a new logging event containing message to attached appender(s) if logger is enabled for TRACE eve...
Definition: log4cxx/logger.h:2265
#define LOG4CXX_DEBUG(logger, message)
Add a new logging event containing message to attached appender(s) if logger is enabled for DEBUG eve...
Definition: log4cxx/logger.h:2221
std::shared_ptr< Logger > LoggerPtr
Definition: defaultloggerfactory.h:27
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. The "example.log" file will be created in our temporary directory.
<?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="${TMP}/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.