当前位置:   article > 正文

spring boot 使用 log4j 异步日志_log4j异步写日志

log4j异步写日志

操作步骤

1. 排除默认的 logback 依赖,同时引入log4j2

<!-- 排除默认的 logback 依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <artifactId>spring-boot-starter-logging</artifactId>
            <groupId>org.springframework.boot</groupId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 引入log4j2依赖 disruptor 异步日志需要-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

2. 配置全局使用log4j2 异步日志

在 resources 目录增加文件: log4j2.component.properties,内容如下:

# 设置异步日志系统属性
log4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

  • 1
  • 2
  • 3

3. 增加日志打印配置文件

在 resources 目录增加文件: log4j2.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="60">

    <Properties>
        <!-- 日志输出格式 -->
        <Property name="log.pattern"
                  value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{30} - [%method,%line] - %msg%n"/>
        <!-- 活动文件的大小 -->
        <Property name="max.file.size" value="524MB"/>
        <Property name="logRootDir" value="${sys:logFile.dir}"/>
        <!-- 保留的归档文件的最大数量 -->
        <Property name="rolloverStrategy.max" value="30"/>
    </Properties>
    <Appenders>
        <!-- 控制台输出 -->
        <Console name="stdoutAppender" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="${log.pattern}" charset="UTF-8"/>
        </Console>

        <RollingFile name="rollingFileAppender" fileName="${logRootDir}/app.log"
                     filePattern="${logRootDir}/app-%d{yyyy-MM-dd}.%i.log">
            <PatternLayout pattern="${log.pattern}" charset="UTF-8"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${max.file.size}"/>
            </Policies>
            <DefaultRolloverStrategy max="${rolloverStrategy.max}"/>
        </RollingFile>
        <RollingFile name="callListLogFileAppender"
                     fileName="${logRootDir}/callist.log"
                     filePattern="${logRootDir}/callist-%d{yyyyMMdd}.%i.log">
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="${max.file.size}"/>
            </Policies>
            <DefaultRolloverStrategy max="200"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="CallList" additivity="false">
            <appender-ref ref="callListLogFileAppender"/>
        </Logger>
        <Root level="INFO" includeLocation="true">
            <appender-ref ref="rollingFileAppender"/>
            <appender-ref ref="stdoutAppender"/>
        </Root>

        <!-- 下面配置一些第三方包的日志过滤级别,用于避免刷屏 -->
        <Logger name="org.hibernate" level="WARN" includeLocation="true"/>
        <Logger name="org.springframework" level="INFO" includeLocation="true"/>
        <Logger name="com.opensymphony" level="WARN" includeLocation="true"/>
        <Logger name="org.apache" level="INFO" includeLocation="true"/>
        <Logger name="org.mybatis" level="INFO" includeLocation="true"/>
    </Loggers>

</configuration>

  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

log4j2 扩展知识

log4j2 异步日志扩展知识(优缺点)

优点

  1. 更高的日志打印峰值吞吐量。您的应用程序可以以6 - 68倍于同步日志记录器的速度记录消息。
  2. 降低日志响应时间延迟。响应时间延迟是在给定工作负载下调用Logger.log返回所需的时间。异步日志记录器的延迟始终低于同步日志记录器,甚至低于基于队列的异步appenders

缺点

  1. 因为异步打印日志,已经切换到 其他线程打印.所以 如果出错了,原来的业务线程感知不到,所以如果用日志做业务流程处理的,比如审计,最好采用同步日志
  2. 如果服务器是单核心的,那么不要采用异步日志,不能增加性能.线程切换,可能导致性能下降.
  3. 如果应用程序记录消息的持续速率快于底层appender的最大持续吞吐量,则队列将满,应用程序将以最慢的appender的速度记录日志。如果发生这种情况,请考虑选择一个更快的appender,或者减少日志记录。如果这两个选项都不行,那么您可以通过同步日志获得更好的吞吐量和更少的延迟峰值。

参考
https://zhuanlan.zhihu.com/p/105428561

log4j2 异步日志使用方式

1. 全部日志采用异步模式
如上次增加 log4j2.component.properties 配置异步 AsyncLoggerContextSelector, 然后 log4j2.xml 和同步的配置一样,不需要再使用 AsAsyncLogger 或 AsyncRoot。

2. 混合同步异步模式
不需要配置 AsyncLoggerContextSelector,直接在 log4j2.xml 混合 Logger 和 AsAsyncLogger。

Random Access File Appender

RollingRandomAccessFile 在异步日志使用中,性能要好与 RollingFile 。使用方式和RollingFile差不多 ,除了始终缓冲的默认缓冲区大小为256 * 1024字节(可以在启动时候指定更改,但不会动态变化了)。

参考资料

https://springframework.guru/asynchronous-logging-with-log4j-2/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/954256
推荐阅读
相关标签
  

闽ICP备14008679号