要想了解log4j如果实现异步日志,进而提升性能,就需要先了解日志打印的基本过程。
在log4j中,有两个重要的概念,分别是 Logger 、 Appender 。Logger是负责具体的生产日志数据,我们平时的Logger.info(...)就是生产日志数据的过程。Appender则是负责讲数据搬运到目的地,如console、文件、hive、网络设备等等。
而log42实现异步日志,主要包括以下两种方式:
异步Logger通过使用LMAX Disruptor环形队列和单独的处理线程,避免了锁的竞争,从而实现更高的吞吐量。队列大小默认4096,通过以下参数,可以开启异步日志。
异步Appender则是使用了java中的ArrayBlockingQueue,默认队列大小1024。log4j2官方测试,asyncLogger相比asyncAppender有更好的表现。
是否可以同时使用AsyncLogger + AsyncAppender?同时使用是否有更好表现?
据stackoverflow上回答,AsyncLogger是更新的异步机制,有更好的表现。AsyncAppender是之前的异步机制。同时使用也不会增加性能表现。见
https://stackoverflow.com/questions/24177601/difference-between-asynclogger-and-asyncappender-in-log4j2
https://logging.apache.org/log4j/2.x/manual/async.html
https://www.cnblogs.com/yeyang/p/7944906.html
https://bryantchang.github.io/2019/01/15/log4j2-asyncLogger/
目前所有的日志记录方式采用的都是同步的方式,即直接将日志写入文件。
在多应用的时候,这种效果会导致一定的线程运行延迟,所以可以采用异步的方式处理。
logback AsyncAppender目前在logback 1.0.11及以上版本存在
集成到项目
异步日志记录是在原来logback上的扩展,并不是替代方式,所以只需要在原来的配置文件上添加一下配置
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)