Log4j日志异步和非异步输出配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Maskkiss/article/details/82012310

一、前言

    在本人的项目中,log4j一直存在两个问题,一是打日志影响到系统性能效率,二是有多线程的时候,日志会比较乱。今天从大佬那里弄来一个解决方案主要解决这两个问题

二、具体配置

    2.1 全异步模式输出日志配置

    这种异步日志方式,不需要修改修改原理的配置文件,Logger仍然使用<Root> and <Logger> 只需要在主程序代码开头,加一句系统属性的代码

System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"); 

     2.2 异步和非异步或者输出模式

    在配置文件中Logger使用<asyncRoot> or <AsyncLogger> 

<loggers>  
        <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true">  
        <appender-ref ref="Console" />  
        <appender-ref ref="debugLog" />  
        <appender-ref ref="errorLog" />  
    </AsyncLogger>  
  
    <asyncRoot level="trace" includeLocation="true">  
        <appender-ref ref="Console" />  
    </asyncRoot>   
</loggers>

     A.用户手册中说全异步模式的性能要高于混合异步模式,但是如果Log4j2用作审计功能(Audit)的话,建议使用混合异步模式。 在异常导致程序退出的情况,担心Log4j2异步输出无法打印错误信息,也专门做了测试。

    B.从测试结果看,在程序异常退出前的所有日志都得到了保存。3,000,000条日志,全异步模式(All Logger Async)用了20分钟打印到日志文件,混合模式(Mixing)用了40分钟。

    C.另外,Log4j2实现高性能的异步日志输出,主要是借助了LMAX Disruptor的开源框架,因此需要添加disruptor的jar包依赖

<!--log4j2异步输出的依赖包-->
        <!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.6</version>
        </dependency>

三、注意事项

    本文中的代码建议不要直接粘贴复制,因为由于编辑平台的问题,可能会出现自动转换中英文标点、全角半角空格等格式问题。

    注意,log4j2.xml这个名字是默认的,放在resource目录下的,如果你是采用默认的,那么web.xml里就不需要配置. 如果需要自定义路径记得在web.xml里如下配置

<context-param>
    <param-name>log4j2ConfigLocation</param-name>
    <param-value>classpath:config/log4j2.xml</param-value>
</context-param>

猜你喜欢

转载自blog.csdn.net/Maskkiss/article/details/82012310