“Log4j 2 异步日志”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
(建立内容为“https://www.bilibili.com/video/BV1iJ411H74S?p=34”的新页面)
 
 
(未显示同一用户的11个中间版本)
第1行: 第1行:
 
https://www.bilibili.com/video/BV1iJ411H74S?p=34
 
https://www.bilibili.com/video/BV1iJ411H74S?p=34
 +
 +
Log4j 2 最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益
 +
 +
=== Log4j 2 同步日志流程 ===
 +
[[文件:同步日志.png|无|缩略图|1300x1300像素]]
 +
 +
 +
 +
=== Log4j 2 异步日志流程 ===
 +
[[文件:Log4j 2 异步日志流程.png|无|缩略图|1002x1002像素]]
 +
Log4j 2 提供了两种实现日志的方式,一个是通过 AsyncAppender,一个是通过 AsyncLogger,分别对应前面的 Appender 组件和 Logger 组件
 +
 +
实际一般使用 AsyncLogger,因为性能比 AsyncAppender 高很多:https://logging.apache.org/log4j/2.x/performance.html#logging-library-performance-comparison
 +
 +
 +
 +
注意:配置异步日志需要添加依赖<syntaxhighlight lang="xml">
 +
        <!-- 异步日志依赖 -->
 +
        <dependency>
 +
            <groupId>com.lmax</groupId>
 +
            <artifactId>disruptor</artifactId>
 +
            <version>3.3.4</version>
 +
        </dependency>
 +
</syntaxhighlight>
 +
 +
 +
 +
=== AsyncAppender 方式 ===
 +
 +
==== log4j2.xml ====
 +
<syntaxhighlight lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<Configuration status="warn">
 +
    <properties>
 +
        <property name="LOG_NAME">E:/logs</property>
 +
    </properties>
 +
 +
 +
    <Appenders>
 +
        <File name="file" fileName="${LOG_HOME}/myfile.log">
 +
            <PatternLayout>
 +
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
 +
            </PatternLayout>
 +
        </File>
 +
 +
        <Async name="async">
 +
            <AppenderRef ref="file"/>
 +
        </Async>
 +
    </Appenders>
 +
 +
    <Loggers>
 +
        <Root level="error">
 +
            <AppenderRef ref="async" />
 +
        </Root>
 +
    </Loggers>
 +
 +
</Configuration>
 +
</syntaxhighlight>这种方式性能上和 Logback 相差无几,所以更推荐下面 AsyncLogger 的方式
 +
 +
 +
 +
 +
=== AsyncLogger 方式 ===
 +
AsyncLogger 才是 Log4j 2 的重头戏,也是官方推荐的异步方式。
 +
 +
它可以使得调用 Logger.log 返回得更快。
 +
 +
有两种选择:全局异步和混合异步。
 +
 +
==== 全局异步 ====
 +
就是所有的日志都异步地记录,在配置文件上不用做任何改动,只需要添加一个 log4j2.component.properties 配置:
 +
 +
===== log4j2.component.properties =====
 +
<syntaxhighlight lang="properties">
 +
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
 +
</syntaxhighlight>
 +
 +
==== 混合异步 ====
 +
就是可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活
 +
 +
要先注释掉<syntaxhighlight lang="properties">
 +
#Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
 +
</syntaxhighlight>
 +
 +
===== log4j2.xml =====
 +
<syntaxhighlight lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<Configuration status="warn">
 +
    <properties>
 +
        <property name="LOG_NAME">E:/logs</property>
 +
    </properties>
 +
 +
 +
    <Appenders>
 +
        <File name="file" fileName="${LOG_HOME}/myfile.log">
 +
            <PatternLayout>
 +
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
 +
            </PatternLayout>
 +
        </File>
 +
 +
        <Async name="async">
 +
            <AppenderRef ref="file"/>
 +
        </Async>
 +
    </Appenders>
 +
 +
    <Loggers>
 +
        <AsyncLogger name="io.github.jihch" level="trace" includeLocation="false" additivity="false">
 +
            <AppenderRef ref="file">
 +
        </AsyncLogger>
 +
 +
        <Root level="error">
 +
            <AppenderRef ref="file" />
 +
        </Root>
 +
    </Loggers>
 +
 +
</Configuration>
 +
</syntaxhighlight>如上配置:io.github.jihch logger 就是异步的,root logger 就是同步的
 +
 +
 +
 +
 +
 +
 +
=== 使用异步日志需要注意的问题 ===
 +
 +
# 如果使用异步日志,AsyncAppender、AsyncLogger 和全局日志,不要同时出现。性能会和 AysncAppender 一致,降至最低
 +
# 设置 includeLocation=false,打印位置信息会急剧降低异步日志的性能,比同步日志还要慢

2023年2月28日 (二) 05:11的最新版本

https://www.bilibili.com/video/BV1iJ411H74S?p=34

Log4j 2 最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益

Log4j 2 同步日志流程

同步日志.png


Log4j 2 异步日志流程

Log4j 2 异步日志流程.png

Log4j 2 提供了两种实现日志的方式,一个是通过 AsyncAppender,一个是通过 AsyncLogger,分别对应前面的 Appender 组件和 Logger 组件

实际一般使用 AsyncLogger,因为性能比 AsyncAppender 高很多:https://logging.apache.org/log4j/2.x/performance.html#logging-library-performance-comparison


注意:配置异步日志需要添加依赖

        <!-- 异步日志依赖 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>


AsyncAppender 方式

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <properties>
        <property name="LOG_NAME">E:/logs</property>
    </properties>


    <Appenders>
        <File name="file" fileName="${LOG_HOME}/myfile.log">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
        </File>

        <Async name="async">
            <AppenderRef ref="file"/>
        </Async>
    </Appenders>

    <Loggers>
        <Root level="error">
            <AppenderRef ref="async" />
        </Root>
    </Loggers>

</Configuration>

这种方式性能上和 Logback 相差无几,所以更推荐下面 AsyncLogger 的方式



AsyncLogger 方式

AsyncLogger 才是 Log4j 2 的重头戏,也是官方推荐的异步方式。

它可以使得调用 Logger.log 返回得更快。

有两种选择:全局异步和混合异步。

全局异步

就是所有的日志都异步地记录,在配置文件上不用做任何改动,只需要添加一个 log4j2.component.properties 配置:

log4j2.component.properties
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

混合异步

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

要先注释掉

#Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <properties>
        <property name="LOG_NAME">E:/logs</property>
    </properties>


    <Appenders>
        <File name="file" fileName="${LOG_HOME}/myfile.log">
            <PatternLayout>
                <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
            </PatternLayout>
        </File>

        <Async name="async">
            <AppenderRef ref="file"/>
        </Async>
    </Appenders>

    <Loggers>
        <AsyncLogger name="io.github.jihch" level="trace" includeLocation="false" additivity="false">
            <AppenderRef ref="file">
        </AsyncLogger>

        <Root level="error">
            <AppenderRef ref="file" />
        </Root>
    </Loggers>

</Configuration>

如上配置:io.github.jihch logger 就是异步的,root logger 就是同步的




使用异步日志需要注意的问题

  1. 如果使用异步日志,AsyncAppender、AsyncLogger 和全局日志,不要同时出现。性能会和 AysncAppender 一致,降至最低
  2. 设置 includeLocation=false,打印位置信息会急剧降低异步日志的性能,比同步日志还要慢