Log4j2不同级别的日志写入到不同文件+扩展日志级别实现业务日志分类

目录

前言

1.不同级别的日志输出到不同的文件

1.1    自定义RollingFile配置

1.2    自定义Console

1.3    Async异步输出

1.4    自定义Logger配置

1.5    自定义统一日志类LogUtil.java

1.6    使用说明

1.6.1.1 通过LogUtil创建业务类日志对象

1.6.1.2 使用业务类日志对象

1.7    日志输出样式

2.扩展日志级别

2.1    自定义日志级别

2.2    自定义RollingFile配置

2.3    Async异步输出

2.4    root引入扩展日志级别

2.5    自定义统一日志类LogUtil.java

2.6    StandardLevel

2.7    使用说明

2.7.1 通过LogUtil创建业务类日志对象

2.7.2 使用业务类日志对象

 

2.8    日志输出样式

3.动态Appender

4.扩展log4j2自定义Appender


前言

该篇适合于工程项目已有对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>

1.4    自定义Logg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值