开发规范之log4j异步打印日志

本文概览
:选择打印日志方案为:
使用log4j,并且使用AsyncLogger

异步打印。


1 日志框架方案

1
、项目中选择日志框架是 log4j2

因为目前常遇见的日志框架有
log4j
logback
log4j2
logback 是为了优化
log4j 而生的,
log4j2 又在
logback 基础上做了优化。所以日志框架选型顺序为:
log4j2 > logback > log4j 。这三个都是同一个作者所写。

2
log4j2
配置为异步方式

使用同步方式,在高并发情况下会对接口性能有影响,所以使用异步方式。异步日志有 AsyncAppender
AsyncLogger
两种方式,

建议使用 AsyncLogger
方式


。AsyncLogger是log4j2新增的,使用LMAX Disruptor来实现高吞吐量;Async Appender在log4j1的时候就已经有了。



2 AsyncLogger 配置异步日志


1
maven 配置

<!--配置4j-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.3</version>
        </dependency>
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.2</version>
        </dependency>

2、log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
 
<!-- No need to set system property "Log4jContextSelector" to any value
     when using <asyncLogger> or <asyncRoot>. -->
 
<Configuration status="WARN">
 
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout>
                <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
            </PatternLayout>
        </Console>
        <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
        <RandomAccessFile name="RandomAccessFile" fileName="./sync.log"
                          immediateFlush="false" append="false">
            <PatternLayout>
                <Pattern>%d %p %class{1.} [%t] %location %m %ex%n</Pattern>
            </PatternLayout>
        </RandomAccessFile>
    </Appenders>
    <Loggers>
        <!-- pattern layout actually uses location, so we need to include it -->
        <AsyncLogger name="com.test" level="info" includeLocation="true">
            <AppenderRef ref="RandomAccessFile"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>
        <AsyncRoot level="info" includeLocation="true">
            <AppenderRef ref="RandomAccessFile"/>
        </AsyncRoot>
    </Loggers>
</Configuration>


3 相关问题


3.1 log4j2和logback冲突问题

一个项目中只能使用log4j2或者logback。假设在项目中使用了log4j2,此时使用外部依赖jar时候,发现外部依赖使用了logbakc,如何解决这个问题?
将外部依赖的logback的包通过exclude排除掉

参考文献

Log4j2中的同步日志与异步日志

https://www.cnblogs.com/yeyang/p/7944906.html

高性能队列——Disruptor

https://tech.meituan.com/2016/11/18/disruptor.html

Asynchronous Loggers for Low-Latency Logging https://logging.apache.org/log4j/log4j-2.3/manual/async.html

原文 

http://www.heartthinkdo.com/?p=3057

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 开发规范之log4j异步打印日志

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址