In log4j tutorial, we saw how to use log4j xml based configuration. But log4j.xml is verbose, so log4j framework provide option to read configuration from properties file too.
Since properties file don’t have any defined schema to validate, we have to be more careful with it. Today we will see how XML configurations can be converted to properties based configuration.
Root Logger
Root logger is used when there is no match with a logger. It’s defined like below in XML.
1 2 3 4 5 6 7 |
<root> <priority value="DEBUG" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </root> |
It can be defined in properties file as below.
1 2 3 |
log4j.rootLogger=DEBUG, file, console |
The first value in comma separated list is the root logging level value. All other values are appenders.
Log4j Appenders
We can have multiple appenders in log4j. Below are two appenders, one for console logging and another to file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<!-- console appender --> <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{1} - %m%n" /> </layout> </appender> <!-- rolling file appender --> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <param name="File" value="logs/main.log" /> <param name="Append" value="true" /> <param name="ImmediateFlush" value="true" /> <param name="MaxFileSize" value="10MB" /> <param name="MaxBackupIndex" value="5" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %d{Z} [%t] %-5p (%F:%L) - %m%n" /> </layout> </appender> |
In log4j.properties file, they will be defined as below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#Define console appender log4j.appender.console=org.apache.log4j.ConsoleAppender logrj.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-5p %c{1} - %m%n #Define rolling file appender log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=logs/main.log log4j.appender.file.Append=true log4j.appender.file.ImmediateFlush=true log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=5 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %d{Z} [%t] %-5p (%F:%L) - %m%n |
So the format for log4j properties file appender is log4j.appender.{appender_name}.{appender_config}
. Notice that the appenders configurations such as MaxFileSize
, MaxBackupIndex
are same as in XML configuration file.
Log4j loggers
Just like appenders, we can have multiple loggers. For example of xml based configuration;
1 2 3 4 5 6 7 8 9 10 11 |
<logger name="com.journaldev.log4j" additivity="false"> <level value="WARN" /> <appender-ref ref="file" /> <appender-ref ref="console" /> </logger> <logger name="com.journaldev.log4j.logic" additivity="false"> <level value="DEBUG" /> <appender-ref ref="file" /> </logger> |
They will be defined in properties file as log4j.logger.{logger_name}
. The values contain logging level and list of appenders to use.
1 2 3 4 5 |
#Define loggers log4j.logger.com.journaldev.log4j=WARN, file, console log4j.logger.com.journaldev.log4j.logic=DEBUG, file, console |
Log4j logger additivity
Additivity usage is shown in above logger xml configuration, it’s the attribute of logger element. Below is the way to use it in log4j properties file configuration as log4j.additivity.{logger_name}
.
1 2 3 4 5 |
#setting additivity log4j.additivity.com.journaldev.log4j=false log4j.additivity.com.journaldev.log4j.logic=false |
Based on above, below is my final log4j.properties file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#Define root logger options log4j.rootLogger=DEBUG, file, console #Define console appender log4j.appender.console=org.apache.log4j.ConsoleAppender logrj.appender.console.Target=System.out log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%-5p %c{1} - %m%n #Define rolling file appender log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=logs/main.log log4j.appender.file.Append=true log4j.appender.file.ImmediateFlush=true log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=5 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %d{Z} [%t] %-5p (%F:%L) - %m%n #Define loggers log4j.logger.com.journaldev.log4j=WARN, file, console log4j.logger.com.journaldev.log4j.logic=DEBUG, file, console #setting additivity log4j.additivity.com.journaldev.log4j=false log4j.additivity.com.journaldev.log4j.logic=false |
Log4j PropertyConfigurator
PropertyConfigurator
is used to configure log4j settings. It’s optional if the file name is log4j.properties and it’s in the project classpath. We have to configure it before using the logger.
Here is a simple program showing how to configure and use log4j logging.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.journaldev.log4j.main; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import com.journaldev.log4j.logic.MathUtils; public class Log4jExample { static{ init(); } private final static Logger logger = Logger.getLogger(Log4jExample.class); public static void main(String[] args) { logger.debug("My Debug Log"); logger.info("My Info Log"); logger.warn("My Warn Log"); logger.error("My error log"); logger.fatal("My fatal log"); } /** * method to init log4j configurations */ private static void init() { PropertyConfigurator.configure("log4j.properties"); } } |
When it’s executed, you will get below in console log.
1 2 3 4 5 |
WARN Log4jExample - My Warn Log ERROR Log4jExample - My error log FATAL Log4jExample - My fatal log |
At the same time, you will see logs getting generated in main.log file as below.
1 2 3 4 5 |
2016-05-14 00:34:11,994 +0530 [main] WARN (Log4jExample.java:20) - My Warn Log 2016-05-14 00:34:11,995 +0530 [main] ERROR (Log4jExample.java:21) - My error log 2016-05-14 00:34:11,995 +0530 [main] FATAL (Log4jExample.java:22) - My fatal log |
Notice that debug and info logger are not getting printed because the minimum logging level is set as WARN. That’s all for log4j properties file example usage. Happy Logging!