本文主要讲解:
1、一个日志配置文件如何拆分
2、不同服务的日志如何划分
3、日志如何滚动
4、日志过期策略
5、异步日志
1、日志拆分
日志配置文件拆分,例如以下完整的日志配置文件
在单个项目中这个配置文件可以直接使用,但是在聚合项目中,我们不可能在每个项目都写一遍完整的日志配置文件。如果这样做,1,容易写错造成日志格式的不统一、2,假如你更改了日志配置,需要更改多个配置文件容易遗漏
所以我们常规做法是将这些公共的配置抽取出来,然后直接引用即可。log4j2的日志拆分和其它日志拆分基本差不多(logback,log4j),官方文档: http://logging.apache.org/log4j/2.x/manual/configuration.html#XInclude
从官方文档看出,log4j2的拆分,依赖XInclude
新建log4j-xinclude-property.xml,抽取Properties
新建log4j-xinclude-appenders.xml,抽取appenders
新建log4j-xinclude-loggers.xml,抽取loggers
最后新建log4j2.xml引用即可
完整的目录结构
2、不同服务的日志如何划分
例如,order(订单系统),goods(商品系统)在同一台服务器上部署,我们希望的日志路径和命名方式是
/data/logs/order/order-info.log
/data/logs/order/order-error.log
/data/logs/goods/goods-info.log
/data/logs/goods/goods-error.log
那也就是动态化服务应用名,如上面Property配置有个SERVER_NAME常量,我这里取自System变量,以此作为服务名。下面的appender使用${SERVER_NAME} 相当于获取了动态服务名
log4j2提供了多个Lookups来满足类似的功能, http://logging.apache.org/log4j/2.x/manual/lookups.html
可以根据实际的项目需求来选择,也可以自定义属于自己的lookup。
3,4、日志如何滚动,日志过期策略
我们以上面的log4j-xinclude-appenders.xml配置中的FILE-INFO来解释
log4j2提供多种Appender, http://logging.apache.org/log4j/2.x/manual/appenders.html# ,因为我们是输入到文件里,所以这里讲RollingRandomAccessFile ,为什么选择RollingRandomAccessFile 呢?官方的描述是: http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFileAppender
大致意思是,RollingRandomAccessFileAppender和 RollingFileAppender 相似,但是它内部是基于ByteBuffer + RandomAccessFile,所以这个性能提高了20-200%,不支持文件锁定,可以自定义文件删除操作等骚操作。
5、异步日志
主要配置在loggers
log4j2的异步日志需要借助LMAX Disruptor 官方文档:
关于异步日志性能,按照官方文档的说法log4j2是目前最强的! http://logging.apache.org/log4j/2.x/manual/async.html#AllAsync
参考文献:
1、 http://logging.apache.org/log4j/2.x/
2、 https://www.ralphgoers.com/post/getting-the-most-out-of-the-log4j-2-api