Log4j2如何实现异步日志配置

时间:2025-03-30 15:24:32

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、异步日志配置

二、全局异步AsyncLogger

三、混合异步AsyncLogger

四、AsyncAppender

总结


前言

前面的文章比较了Log4j2同步日志和异步日志的性能,可以看到异步日志在性能方面好很多,我们来看下如何进行异步日志的配置。


一、异步日志配置

要实现异步日志配置,需要在文件添加依赖:

<!-- 异步日志依赖 -->
<dependency>
    <groupId></groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.4</version>
</dependency>

Log4j2提供了三种异步日志实现方法:全局异步AsyncLogger(推荐使用)、混合异步AsyncLogger(推荐使用)、AsyncAppender。

log4j2的全局异步AsyncLogger性能最好,其次是混合异步AsyncLogger,性能最差的是AsyncAppender(和同步日志相比没有什么性能提升。和logback性能一样)。

如果使用异步日志,全局异步AsyncLogger、混合异步AsyncLogger、AsyncAppender,不要同时使用。否则会使用性能较低的一种异步方式。

二、全局异步AsyncLogger

所有appender的所有日志级别的日志都异步的记录,不需要改动配置文件。只需要在classpath,比如resources目录下,新建配置文件。内容如下:

Log4jContextSelector=.

该处使用的url网络请求的数据。

三、混合异步AsyncLogger

可以同时使用同步日志和异步日志,这使得日志的配置方式更加灵活

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="30">


    <Appenders>
		<!--这个输出控制台的配置 -->
		<console name="Console" target="SYSTEM_OUT">
			<!--输出日志的格式 -->
			<PatternLayout pattern="${log_pattern}" />
		</console>
    </Appenders>

    <Loggers>
        <!-- 自定义异步logger对象, name必须是()对应 -->
        <!-- 如果设置includeLocation=true, 开启日志记录行号信息会急剧降低异步日志的性能,比同步日志还要慢 -->
        <!-- 这里设置includeLocation=false,则PatternLayout的%l将不会打印出来 -->
        <!-- additivity="false": 不再继承RootLogger对象. 这里建议强制设置成false -->
        <AsyncLogger name="Log4j2Test" level="WARN" includeLocation="false" additivity="false">
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <!-- RootLogger是同步的。除Log4j2Test外,其它名称的logger使用RootLogger进行输出 -->
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

四、AsyncAppender

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">

    <properties>
        <property name="LOG_HOME">/Users/userName/Logs/appName</property>
    </properties>

    <Appenders>
        <File name="File" fileName="${LOG_HOME}/">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:} [%thread] [%-5level] %l --- %msg%n" />
        </File>

        <!-- AsyncAppender引用appender -->
        <Async name="Async">
            <AppenderRef ref="File"/>
        </Async>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <!-- 直接引用AsyncAppender -->
            <AppenderRef ref="Async" />
        </Root>
    </Loggers>
</Configuration>


总结

Log4j2提供了三种异步日志实现方法:全局异步AsyncLogger、混合异步AsyncLogger、AsyncAppender,推荐使用AsyncLogger方式,以上就是三种异步日志实现方法的配置。