Apache Log4j2是对 Log4j 1.x 的升级,与其前身相比提供了重大改进,例如性能改进、修改后的配置文件的自动重新加载、Java 8 lambda支持和自定义日志级别。
Log4j 2.4 及更高版本需要 Java 7。版本 2.0-alpha1 到 2.3 需要 Java 6。
1. Log4j2 Maven 依赖
要在项目中包含Log4j2,请包含以下 maven 依赖项。
< dependency >
< groupId >org.apache.logging.log4j</ groupId >
< artifactId >log4j-api</ artifactId >
< version >2.6.1</ version >
</ dependency >
< dependency >
< groupId >org.apache.logging.log4j</ groupId >
< artifactId >log4j-core</ artifactId >
< version >2.6.1</ version >
</ dependency >
|
2. Log4j2.xml – 控制台日志
您可以使用以下log4j2.xml
文件将输出记录到控制台。请注意,如果找不到配置文件,DefaultConfiguration
则将使用。这也会导致日志输出进入控制台。
<? xml version = "1.0" encoding = "UTF-8" ?>
< Configuration status = "INFO" >
< Appenders >
< Console name = "console" target = "SYSTEM_OUT" >
< PatternLayout
pattern = "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</ Console >
</ Appenders >
< Loggers >
< Root level = "debug" additivity = "false" >
< AppenderRef ref = "console" />
</ Root >
</ Loggers >
</ Configuration >
|
3. Log4j2.xml – 滚动文件追加器
您可以使用以下log4j2.xml
文件将输出记录到基于日期的滚动文件中 - 以及控制台。
<? xml version = "1.0" encoding = "UTF-8" ?>
< Configuration status = "warn" >
< Properties >
< Property name = "basePath" >C:\\logs</ Property >
</ Properties >
< Appenders >
< RollingFile name = "fileLogger" fileName = "${basePath}/app-info.log" filePattern = "${basePath}/app-info-%d{yyyy-MM-dd}.log" >
< PatternLayout >
< pattern >[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</ pattern >
</ PatternLayout >
< Policies >
< TimeBasedTriggeringPolicy interval = "1" modulate = "true" />
</ Policies >
</ RollingFile >
< Console name = "console" target = "SYSTEM_OUT" >
< PatternLayout pattern = "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</ Console >
</ Appenders >
< Loggers >
< Logger name = "com.howtodoinjava" level = "debug" additivity = "true" >
< appender-ref ref = "fileLogger" level = "debug" />
</ Logger >
< Root level = "debug" additivity = "false" >
< appender-ref ref = "console" />
</ Root >
</ Loggers >
</ Configuration >
|
4. Log4j2.xml – 多文件追加器
使用这个简单log4j2.xml
来快速参考多个日志文件中的日志语句。它记录不同级别的日志(debug
,info
等等),以不同的文件,使用LevelRangeFilter
,让您的日志干净,分隔,便于分析。
<? xml version = "1.0" encoding = "UTF-8" ?>
< Configuration status = "WARN" monitorInterval = "30" >
<!-- Logging Properties -->
< Properties >
< Property name = "LOG_PATTERN" >%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</ Property >
< Property name = "APP_LOG_ROOT" >c:/temp</ Property >
</ Properties >
< Appenders >
<!-- Console Appender -->
< Console name = "Console" target = "SYSTEM_OUT" follow = "true" >
< PatternLayout pattern = "${LOG_PATTERN}" />
</ Console >
<!-- File Appenders on need basis -->
< RollingFile name = "frameworkLog" fileName = "${APP_LOG_ROOT}/app-framework.log"
filePattern = "${APP_LOG_ROOT}/app-framework-%d{yyyy-MM-dd}-%i.log" >
< LevelRangeFilter minLevel = "ERROR" maxLevel = "ERROR" onMatch = "ACCEPT" onMismatch = "DENY" />
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "10" />
</ RollingFile >
< RollingFile name = "debugLog" fileName = "${APP_LOG_ROOT}/app-debug.log"
filePattern = "${APP_LOG_ROOT}/app-debug-%d{yyyy-MM-dd}-%i.log" >
< LevelRangeFilter minLevel = "DEBUG" maxLevel = "DEBUG" onMatch = "ACCEPT" onMismatch = "DENY" />
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "10" />
</ RollingFile >
< RollingFile name = "infoLog" fileName = "${APP_LOG_ROOT}/app-info.log"
filePattern = "${APP_LOG_ROOT}/app-info-%d{yyyy-MM-dd}-%i.log" >
< LevelRangeFilter minLevel = "INFO" maxLevel = "INFO" onMatch = "ACCEPT" onMismatch = "DENY" />
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "10" />
</ RollingFile >
< RollingFile name = "errorLog" fileName = "${APP_LOG_ROOT}/app-error.log"
filePattern = "${APP_LOG_ROOT}/app-error-%d{yyyy-MM-dd}-%i.log" >
< LevelRangeFilter minLevel = "ERROR" maxLevel = "ERROR" onMatch = "ACCEPT" onMismatch = "DENY" />
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "10" />
</ RollingFile >
< RollingFile name = "perfLog" fileName = "${APP_LOG_ROOT}/app-perf.log"
filePattern = "${APP_LOG_ROOT}/app-perf-%d{yyyy-MM-dd}-%i.log" >
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "1" />
</ RollingFile >
< RollingFile name = "traceLog" fileName = "${APP_LOG_ROOT}/app-trace.log"
filePattern = "${APP_LOG_ROOT}/app-trace-%d{yyyy-MM-dd}-%i.log" >
< PatternLayout pattern = "${LOG_PATTERN}" />
< Policies >
< SizeBasedTriggeringPolicy size = "19500KB" />
</ Policies >
< DefaultRolloverStrategy max = "1" />
</ RollingFile >
</ Appenders >
< Loggers >
< Logger name = "com.howtodoinjava.app.somePackage" additivity = "false" level = "trace" >
< AppenderRef ref = "traceLog" />
< AppenderRef ref = "Console" />
</ Logger >
< Logger name = "com.howtodoinjava.app" additivity = "false" level = "debug" >
< AppenderRef ref = "debugLog" />
< AppenderRef ref = "infoLog" />
< AppenderRef ref = "errorLog" />
< AppenderRef ref = "Console" />
</ Logger >
< Logger name = "org.framework.package" additivity = "false" level = "info" >
< AppenderRef ref = "perfLog" />
< AppenderRef ref = "Console" />
</ Logger >
< Root level = "warn" >
< AppenderRef ref = "Console" />
</ Root >
</ Loggers >
</ Configuration >
|
5. Log4j2.xml 文件位置
您应该将其log4j2.xml
放在应用程序的类路径中的任何位置。Log4j 将扫描所有类路径位置以找出此文件,然后加载它。
Log4j2.xml 文件位置
6. 演示
让我们编写一个 java 类并编写一些日志语句来验证日志是否也在控制台和日志文件中显示。它将不同的日志级别记录到不同的日志
package com.howtodoinjava.log4j2.examples;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2HelloWorldExample
{
private static final Logger LOGGER = LogManager.getLogger(Log4j2HelloWorldExample. class .getName());
public static void main(String[] args)
{
LOGGER.debug( "Debug Message Logged !!!" );
LOGGER.info( "Info Message Logged !!!" );
LOGGER.error( "Error Message Logged !!!" , new NullPointerException( "NullError" ));
}
}
|
现在,当您运行上述程序时,您将在控制台中获得以下日志。
[DEBUG] 2016-06-16 12:17:42.972 [main] Log4j2HelloWorldExample - 记录调试消息!!!
[INFO] 2016-06-16 12:17:42.996 [main] Log4j2HelloWorldExample - 信息消息记录!!!
[错误] 2016-06-16 12:17:42.997 [main] Log4j2HelloWorldExample - 记录错误信息!!!
java.lang.NullPointerException: NullError
在 com.howtodoinjava.log4j2.examples.Log4j2HelloWorldExample.main(Log4j2HelloWorldExample.java:14) [classes/:?]
如果更改系统的日期和再次运行应用程序,你会发现在配置位置即两个日志文件app-info.log
和app-info-2016-06-15.log
-在第二个文件是翻了个身文件。