log4j2.xml example
Some log4j2.xml
examples, just for self-reference
P.S Tested with Log4j 2.11.2
1. ConsoleAppender
Logs to console.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<!-- avoid duplicated logs with additivity=false -->
<Logger name="com.mkyong" level="debug" additivity="false">
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
2. FileAppender
Logs to a file.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<File name="LogToFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<!-- avoid duplicated logs with additivity=false -->
<Logger name="com.mkyong" level="debug" additivity="false">
<AppenderRef ref="LogToFile"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToFile"/>
</Root>
</Loggers>
</Configuration>
3. ConsoleAppender + FileAppender
Logs to both console and file.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="LogToFile" fileName="logs/app.log">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
</File>
</Appenders>
<Loggers>
<Logger name="com.mkyong" level="debug" additivity="false">
<AppenderRef ref="LogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Logger name="org.springframework.boot" level="error" additivity="false">
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToFile"/>
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
4 RollingFileAppender
Rotate log file. If file size > 10m or the current date is different with the log file time stamp, create archives.
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
<Appenders>
<Console name="LogToConsole" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<RollingFile name="LogToRollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!-- avoid duplicated logs with additivity=false -->
<Logger name="com.mkyong" level="debug" additivity="false">
<AppenderRef ref="LogToRollingFile"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToConsole"/>
</Root>
</Loggers>
</Configuration>
By default, it will create up to 7 archives on the same day.
We can override the default 7 archives with this DefaultRolloverStrategy
<RollingFile name="LogToRollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="10 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
5 RollingRandomAccessFileAppender
Similar to the RollingFileAppender
, but faster.
log4j2.xml
<RollingRandomAccessFile name="LogToRollingRandomAccessFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
6 SMTPAppender
Need javax.mail
to send email.
pom.xml
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<RollingRandomAccessFile name="LogToRollingRandomAccessFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="1 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingRandomAccessFile>
<SMTP name="LogToMail" subject="Error Log From Log4j"
from="from@DOMAIN"
to="to@DOMAIN"
smtpHost="smtp.mailgun.org"
smtpPort="25"
smtpUsername="abc"
smtpPassword="123"
bufferSize="100">
</SMTP>
</Appenders>
<Loggers>
<Logger name="com.mkyong" level="debug" additivity="false">
<AppenderRef ref="LogToRollingRandomAccessFile"/>
<AppenderRef ref="LogToConsole"/>
</Logger>
<Root level="error">
<AppenderRef ref="LogToMail"/>
</Root>
</Loggers>
</Configuration>
Sample email
Download Source Code
$ git clone https://github.com/mkyong/java-logging.git
$ cd log4j2
$ cd log4j2
Hey mkyong, great article. I implemented the above Log4j2 xml configuration onto my project. Now everytime I run the test, the logs are just added to the file instead of overwriting. Can you tell me, how to achieve that from your 3rd example of Log4j2
3. ConsoleAppender + FileAppender
https://logging.apache.org/log4j/2.x/manual/appenders.html#FileAppender
Review the
append
, default is true.To overwriting the existing file :
<File name=”LogToFile” fileName=”logs/app.log” append=”false”>
4 RollingFileAppender – also doesn’t work. Only works to console, blank log created
HI Mykong,
I have java application running in docker container which should write logs to a cloud object storage(COS).
I have tried RollingFile and RollingRandomAccess appenders, both of them are not writing logs to COS. I can see the logs in pod but the moment i use cyberduck to navigate to the log file location I can not see any logs.
Any help will be appreciated,
Hi Mkyong,
I am using env variable in the jvm property and that variable we define in log4j2.xml file for logs path. But logs are not rolling on that path it is not taking the env variable value in the log4j2.xml file. Can you please help how we can fix this.
Thanks for the log4j2 tutorial. We would like to write file logs module wise i.e. com.master > master_logs.log and com.transaction > transaction_logs.log
<?xml version=”1.0″ encoding=”UTF-8″?>
<Configuration xmlns=”http://logging.apache.org/log4j/2.0/config”>
<Properties>
<Property name=”basePath”>/Logs</Property>
</Properties>
<Appenders>
<!– File Appender –>
<File name=”FILE” fileName=”${basePath}/master_logs.log” append=”true”>
<PatternLayout pattern=”%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) – %m%n” />
</File>
<File name=”FILE1″ fileName=”${basePath}/transaction_logs.log” append=”true”>
<PatternLayout pattern=”%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) – %m%n” />
</File>
<!– Console Appender –>
<Console name=”STDOUT” target=”SYSTEM_OUT”>
<PatternLayout pattern=”%-5p | %d{yyyy-MM-dd HH:mm:ss} | [%t] %C{2} (%F:%L) – %m%n” />
</Console>
</Appenders>
<Loggers>
<Logger name=”com.master” level=”error” additivity=”false” >
<AppenderRef ref=”FILE” />
</Logger>
<Logger name=”com.transaction” level=”error” additivity=”false” >
<AppenderRef ref=”FILE2″ />
</Logger>
<Root level=”info”>
<AppenderRef ref=”STDOUT” />
</Root>
</Loggers>
</Configuration>
Kindly suggest suitable change in the xml
Thanks for the log4j2 tutorial. We would like to write file logs module wise i.e. com.master > master_logs.log and com.transaction > transaction_logs.log
<Logger name=”com.master” level=”error” additivity=”false” >
<AppenderRef ref=”FILE1″ />
</Logger>
<Logger name=”com.transaction” level=”error” additivity=”false” >
<AppenderRef ref=”FILE2″ />
</Logger>
Do you have an example of using an Application Insights Appender by any chance?
Hi Mkyong – I used your Rolling file appender example and I am able to get the log file generated, however upon reaching the file size, it overrides the existing file i.e. I lose the logs for previous executions. I want it to be configured to create archive instead of losing it.
Please help..
Nice article to get the feet wet. But Shouldn’t there be some example of properties attribute as well and how to read them in JAVA?
This article focus on the log4j2.xml examples, for full Java log4j2 example try below link:
https://mkyong.com/logging/apache-log4j-2-tutorials/