目录
前言
该篇适合于工程项目已有对info、warn、error等不同级别日志的统一拦截,仍需要根据业务将不同业务的日志分级别输出到不同的文件中,这些日志文件只有该业务的日志,不含有系统其它业务、框架等的日志;网上很多都是千篇一律的东西,内容老旧,错误百出,不能解决问题,该篇文章是将实际的集成过程整理,并将遇到的问题进行了说明,另外java代码实现动态日志附加器是根据log4j2的新方法实现,不是网上都在转的log4j(很多方法会显示已启用),可供大家参考。
设计思路:
- 首先定义业务名称,日志输出的时候带有该业务的名称(日志格式可以灵活设置)
- 其次通过统一的LogUtil工具类进行输出,并将logger标签配置到LogUtil,这样做的目的是避免系统已存在的日志附加器RollingFile配置输出的日志写入到业务日志文件,造成日志混乱,
- 统一的LogUtil类,通过集成原生的ExtendedLoggerWrapper既实现了日志级别的扩展,也可以在业务类使用LogUtil的时候通过工厂模式获取到当前业务类的日志对象,从而通过该对象获取到业务类的全路径,方便日志输出的灵活改造。
- 最后扩展日志级别,扩展的日志级别主要用于补充业务场景,更多的用在公共组件、中间件内部进行输出(根据实际情况和要求设计)。
这里再说一下,如果对整个系统实现不同级别的日志写入到不同的文件,以下的配置修改一下即可,而且不需要创建LogUtil,也不需要扩展日志级别,配置好RollingFile,Console,直接引入到root(实际上是使用了默认的日志检测路径)就可以实现。
1.不同级别的日志输出到不同的文件
1.1 自定义RollingFile配置
自定义Customer类型、INFO级别日志输出
名称:CustomerInfoLog
存储路径:项目配置路径+ /logs/Customer/CustomerInfo.log
日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"
其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。
<!-- 自定义Customer类型INFO级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerInfoLog" fileName="${LOG_HOME}/logs/Customer/CustomerInfo.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerInfo/CustomerInfo-%d{MM-dd-yyyy}-%i.log.gz">
<!-- 过滤日志级别 info及以上 -->
<Filters>
<ThresholdFilter onMismatch="NEUTRAL" onMatch="DENY" level="WARN"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<!-- 指定日志输出格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
<!-- 新文件生成策略,每100M生成一个新文件 -->
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
<DefaultRolloverStrategy>
<!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称,IfLastModified指定持续时间(7天前)-->
<Delete basePath="${LOG_HOME}" maxDepth="4">
<IfFileName glob="*/Customer/CustomerInfo/CustomerInfo-*.log.gz" />
<IfLastModified age="${FILE_DEADLINE}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
自定义Customer类型、WARN级别日志输出
名称:CustomerWarnLog
存储路径:项目配置路径+ /logs/Customer/CustomerWarn.log
日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"
其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。
<!-- 自定义WARN级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerWarnLog" fileName="${LOG_HOME}/logs/Customer/CustomerWarn.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerWarn/CustomerWarn-%d{MM-dd-yyyy}-%i.log.gz">
<!-- 过滤日志级别 info及以上 -->
<Filters>
<ThresholdFilter onMismatch="NEUTRAL" onMatch="DENY" level="ERROR"/>
<ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<!-- 指定日志输出格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
<!-- 新文件生成策略,每100M生成一个新文件 -->
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
<DefaultRolloverStrategy>
<!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称,IfLastModified指定持续时间(7天前)-->
<Delete basePath="${LOG_HOME}" maxDepth="4">
<IfFileName glob="*/Customer/CustomerWarn/CustomerWarn-*.log.gz" />
<IfLastModified age="${FILE_DEADLINE}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
自定义Customer类型、ERROR级别日志输出
名称:CustomerErrorLog
存储路径:项目配置路径+ /logs/Customer/CustomerError.log
日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"
其他内容参考以下配置:LOG_HOME是自己配置的项目日志路径property;FILE_DEADLINE是自己配置的保存时间property。
<!-- 自定义ERROR级别日志附加器 -->
<!-- 滚动文件生成 fileName日志文件名称,filePattern压缩文件路径 -->
<RollingFile name="CustomerErrorLog" fileName="${LOG_HOME}/logs/Customer/CustomerError.log"
filePattern="${LOG_HOME}/logs/Customer/CustomerError/CustomerError-%d{MM-dd-yyyy}-%i.log.gz">
<!-- 过滤日志级别 info及以上 -->
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<!-- 指定日志输出格式 -->
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
<!-- 新文件生成策略,每100M生成一个新文件 -->
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="100 MB" />
</Policies>
<!-- 默认过度策略,不设置,则默认为最多同一文件夹下7个文件 大于此值会删除旧的日志文件 -->
<DefaultRolloverStrategy>
<!-- 文件删除策略,basePath扫描路径,maxDepth目录的最大级别数,IfFileName文件名称, IfLastModified指定持续时间(7天前)-->
<Delete basePath="${LOG_HOME}" maxDepth="4">
<IfFileName glob="*/Customer/CustomerError/CustomerError-*.log.gz" />
<IfLastModified age="${FILE_DEADLINE}" />
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
1.2 自定义Console
自定义Customer类型、CONSOLE(控制台)日志输出
名称:CustomerCONSOLE
日志输出格式:%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n"
<Console name="CustomerCONSOLE" target="system_out">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] Customer [%L] %msg%n" />
</Console>
日志输出格式如下:
2020-11-22 20:07:06.927 |-INFO [http-nio-9991-exec-1] Customer [] com.xxx.controller.TestController -| xxxxxxxxx
1.3 Async异步输出
将Customer日志类型的INFO、WARN、ERROR的RollingFile以及自定义的CONSOLE引入
<Async name="AsyncCustomerInfoLog">
<AppenderRef ref="CustomerInfoLog"/>
</Async>
<Async name="AsyncCustomerWarnLog">
<AppenderRef ref="CustomerWarnLog"/>
</Async>
<Async name="AsyncCustomerErrorLog">
<AppenderRef ref="CustomerErrorLog"/>
</Async>
<Async name="AsyncCustomerCONSOLE">
<AppenderRef ref="CustomerCONSOLE"/>
</Async>