%m%n”/>


























1
2
3
4
5
6
7
8
9
10
11
12
13
## 异步日志(额外依赖)
![image.png](https://cdn.nlark.com/yuque/0/2022/png/28371701/1655627017912-53ca667e-893e-4cac-90eb-854d7a1dbdc0.png#clientId=u96078993-1ad9-4&from=paste&id=u55e37d00&name=image.png&originHeight=256&originWidth=740&originalType=url&ratio=1&rotation=0&showTitle=false&size=104259&status=done&style=none&taskId=ub8c5b61e-5501-4700-b32e-a77c94c5bd0&title=)

- 异步日志形式![image.png](https://cdn.nlark.com/yuque/0/2022/png/28371701/1655627041590-b686dac2-953c-420d-9dd5-0b7b20b1816e.png#clientId=u96078993-1ad9-4&from=paste&id=ud5c10718&name=image.png&originHeight=153&originWidth=743&originalType=url&ratio=1&rotation=0&showTitle=false&size=92262&status=done&style=none&taskId=u0d0e8d42-5bb3-49fb-8c05-9d2f23ff78c&title=)
> Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应 前面我们说的Appender组件和Logger组件。
> **注意:配置异步日志需要添加依赖**

```xml
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>

AsyncAppender方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">
<properties>
<property name="LOG_HOME">./logs</property>
</properties>
<Appenders>
<File name="file" fileName="${LOG_HOME}/myfile.log">
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
</File>
<Async name="Async"> <==异步形式
<AppenderRef ref="file"/>
</Async>
</Appenders>
<Loggers>
<!--默认使用rootLogger-->
<Root level="error">
<AppenderRef ref="Async"/> <==异步形式
</Root>
</Loggers>
</Configuration>

AsyncLogger方式

AsyncLogger才是log4j2 的重头戏,也是官方推荐的异步方式。它可以使得调用Logger.log返回的 更快。你可以有两种选择:全局异步和混合异步。

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

    1
    Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
  • 混合异步就是,你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" monitorInterval="5">
    <properties>
    <property name="LOG_HOME">./logs</property>
    </properties>
    <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
    <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
    </Console>
    <File name="file" fileName="${LOG_HOME}/myfile.log">
    <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l%c{36} - %m%n"/>
    </File>
    </Appenders>
    <Loggers>
    <!--默认使用rootLogger-->
    <Root level="error">
    <AppenderRef ref="Console"/>
    </Root>

    <!--自定义异步Logger对象 includeLocation:关闭日志行号信息 addivitity:是否进行继承-->
    <AsyncLogger name="cn.quguai" level="info" includeLocation="false" addivitity="false">
    <AppenderRef ref="file"/>
    </AsyncLogger>
    </Loggers>
    </Configuration>

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

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