pom.xml依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
<!--解决web项目log4j可能出现警告的jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.11.2</version>
</dependency>
<!--log4j2的异步日志功能包,使用AsyncLogger需要-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.2</version>
</dependency>
<!--使用slf4j作为日志门面-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<!--slf4j对应log4j2日志框架的驱动包,用于slf4j与log4j2保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
web.xml配置
<context-param>
<param-name>log4jContextName</param-name>
<param-value>star</param-value>
</context-param>
<context-param>
<param-name>log4jConfiguration</param-name>
<param-value>classpath:conf/log4j2.xml</param-value>
</context-param>
<listener>
<listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>
log4j2配置文件
- xml
- appender:
- Console
<Appenders> <!--输出方式:SYSTEM_OUT 或 SYSTEM_ERR --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders>
- File, RandomAccessFile
前者使用FileOutputStream, 后者使用RandomAccessFile,在bufferedIO=true(默认)情况下后者性能高
<!--默认输出位置为${sys:catalina.home}/bin--> <!--immediateFlush为false时不会立即刷新到文件--> <RandomAccessFile name="random_access_file" fileName="logs/random_access_file.log" immediateFlush="false" append="true"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </RandomAccessFile>
- RollingFile, RollingRandomAccessFile
触发机制:CompositeTriggeringPolicy
,OnStartupTriggeringPolicy
,SizeBasedTriggeringPolicy
和TimeBasedTriggeringPolicy
,要注意按时间TimeBasedRollingPolicy
和按大小生成SizeBasedTriggeringPolicy
冲突问题
<!--immediateFlush:立即将日志刷到磁盘,默认为true--> <!--fileName:日志存储路径--> <!--filePattern:历史日志封存路径,自动识别zip等后缀,进行压缩--> <!--使用SizeBasedTriggeringPolicy时,filePattern后面要加%i,否则会与TimeBasedTriggeringPolicy冲突--> <RollingRandomAccessFile name="common_rolling_file" fileName="logs/common_rolling_file.log" immediateFlush="true" filePattern="logs/common-%d{yyyy-MM-dd-HH-mm-ss-SSS}-%i.zip" append="true"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> <Policies> <!--日志文件大小--> <SizeBasedTriggeringPolicy size="100kB"/> <!--最多保留文件数--> <DefaultRolloverStrategy max="20"/> </Policies> </RollingRandomAccessFile>
- filter
<Filters> <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> </Filters>
- Loggers
- PatternLayout
- 设置内容长度:在%和内容之间添加数字,空格补齐,
.
表示最大宽度,负数表示左对齐,例如%-5level
,%20.30class
%level{参数1}{参数2}{参数3}
-日志级别%n
-换行%t
或%thread
-创建logger的线程名%m
或%msg
或%message
-日志信息%d{参数}
-时间%c{参数}
或%logger{参数}
-日志名称
- 设置内容长度:在%和内容之间添加数字,空格补齐,
- appender:
异步日志
- 优点:更高的峰值吞吐量,同步日志的6 - 68倍;更低的响应延迟
- 异步日志使用单独的线程执行IO操作,提高系统性能
- 可选择全局异步或者混合异步,全局异步获取最佳性能,混合异步更具灵活性
- 异步Loggers使用LMAX Disruptor技术,比队列吞吐量更高,延迟更低
- 异步Appenders使用jdk自带的ArrayBlockingQueue,无需导入disruptor
- 全局异步:将系统属性
log4j2.contextSelector
设置为org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
,当使用AsyncLoggerContextSelector
设置为全局异步时,配置文件中只能使用<root>
和<logger>
这种常规标签,没必要再用<asyncRoot>
和<asyncLogger>
标签
- 可以在系统初始化时,增加全局参数设置:
System.setProperty("log4j2.contextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
- 加载在jvm启动参数里
java -Dog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
- 对于web应用,可以在web.xml中配置自定义ContextLoaderListener,contextInitialized方法中执行1
- 混合异步:
使用<asyncRoot>
和<asyncLogger>
标签,配置文件中只能有<asynRoot>
和<asyncLogger>
两者之一, - 如果Filter或者PatternLayout配置了与location(定位)相关的属性,例如
HTML locationInfo
或者%C or %class, %F or %file, %l or %location, %L or %line, %M or %method
属性之一,log4j会对栈拍快照,然后查找这些属性的值,非常耗时,不建议使用。默认情况下,异步Logger不会将location信息传递给IO线程,需要在相应的logger中设置"includeLocation=true"
,包括Root
<Loggers>
<Root level="info" includeLocation="true">
<AppenderRef ref="RandomAccessFile"/>
</Root>
</Loggers>
参考
http://logging.apache.org/log4j/2.x/manual/async.html
http://logging.apache.org/log4j/2.x/manual/configuration.html
https://blog.csdn.net/henry115/article/details/78483457
https://www.jianshu.com/p/9f0c67facbe2