首页 > 作文

关于log4j2的异步日志输出方式

更新时间:2023-04-04 04:50:06 阅读: 评论:0

目录
log4j2的异步日志输出方式第一种实现异步方式asyncappender第二种实现异步方式asyncloggerlog4j2异步注意事项log4j2异步类型小提示

log4j2的异步日志输出方式

使用log4j2的同步日志进行日志输出,日志输出语句与程序的业务逻辑语句将在同一个线程运行。

而使用异步日志进行输出时,日志输出语句与业务逻辑语句并不是在同一个线程中运行,而是有专门的线程用于进行日志输出操作,处理业务逻辑的主线程不用等待即可执行后续业务逻辑。

log4j2中的异步日志实现方式有asyncappender和asynclogger两种。

其中:

asyncappender采用了arrayblockingqueue来保存需要异步输出的日志事件;asynclogger则使用了disruptor框架来实现高吞吐。

第一种实现异步方式asyncappender

asyncappender直接在彩虹岛3转任务log4j2的xml的配置文件中配置,注意下面代码的注释位置

<?xml version="1.0" encoding="utf-8"?><configuration status="warn">  <appenders>    <!--正常的appender配置,此处配置的rollingfile会在下面asyncappender被通过name引用-->    <rollingfile name="rollingfileerror" filename="${log_home}/error.${date:yyyy-mm-dd}.log" immediateflush="true"filepattern="${log_home}/$${date:yyyy-mm}/error-%d{mm-dd-yyyy}-%i.log.gz">     <patternlayout pattern="%d{yyyy-mm-dd 'at' hh:mm:ss z} %-5level %logger{36} : %msg%xex%n"/>     <thresholdfilter level="error" onmatch="accept" onmismatch="deny"/>     <policies>                <timebadtriggeringpolicy modulate="true" interval="1"/>                <sizebadtriggeringpolicy size="10mb"/>     </policies>   </rollingfile>    <!--一个appender配置完毕-->    <!--异步asyncappender进行配置直接引用上面的rollingfile的name-->    <async name="async">      <appenderref ref="myfile"/>    </async>    <!--异步asyncappender配置完毕,需要几个配置几个-->  </appenders>  <loggers>    <root level="error">      <!--此处如果引用异步asyncappender的name就是异步输出日志-->      <!--此处如果引用appenders标签中rollingfile的name就是同步输出日志-->      <appenderref ref="async"/>    </root>  </loggers></configuration>

重点内容全在上面代码的注释中,asyncappender的配置就在xml文件中实现,无需单独引用包来支持.配置asyncappender后,日志事件写入文件的操作将在单独的线程中执行。

asyncappender的常用参数

参数名类型说明namestringasy2009歌曲nc appender的名字appenderrefstring异步调用的appender的名字,可以配置多个blockingboolean默认为true。如果为true,appender将一直等待直到queue中有空闲;如果为fal,当队列满的时候,日志事件将被丢弃。(如果配置了error appender,要丢弃的日志事件将由error appender处理)buffersizeinteger队列中可存储的日志事件的最大数量,默认为128

第二种实现异步方式asynclogger

log4j2中的asynclogger的内部使用了disruptor框架。

disruptor简介

disruptor是英国外汇交易公司lmax开发的一个高性能队列,基于disruptor开发的系统单线程能支撑每秒600万订单。

目前,包括apache strom、log4j2在内的很多知名项目都应用了disruptor来获取高性能。

disruptor框架内部核心数据结构为ringbuffer,其为无锁环形队列。

disruptor为什么这么快?

lock-free-使用了cas来实现线程安全使用缓存行填充解决伪共享问题

首先在pom单中应用相关的包

<dependency>  <groupid>com.lmax</groupid>  <artifactid>disruptor</artifactid>  <version>3.4.2</version></dependency>

第二步在log4j2的xml文件中配置asynclogger

log4j2.xml配置如下:

<?xml version="1.0" encoding="utf-8"?><configuration status="debug" name="myapp" packages="">    <appenders>        <console name="console" target="system_out">            <patternlayout pattern="%d{hh:mm:ss.sss} [%t] %-5level %logger{36} - %msg%n" />        </console>        <rollingfile name="rollingfile" filename="logs/app.log"                     filepattern="logs/app-%d{yyyy-mm-dd hh}.log">            <patternlayout>                <pattern>%d %p %c{1.} [%t] %m%n</pattern>            </patternlayout>            <policies>                <sizeba科技创新的例子dtriggeringpolicy size="500mb"/>            </policies>        </rollingfile>        <rollingfile name="rollingfile2" filename="logs/app2.log"                     filepattern="logs/app2-%d{yyyy-mm-dd hh}.log">            <patternlayout>                <pattern>%d %p %c{1.} [%t] %m%n</pattern>            </patternlayout>            <policies>                <sizebadtriggeringpolicy size="500mb"/>            </policies>        </rollingfile>    </appenders>    <loggers>    <!--上面的配置都和原配置一样,就是在下方这直接定义asynclogger,他的name在java类中被引用即可-->        <asynclogger name="com.meituan.main" level="trace" additivity="fal">            <appender-ref ref="rollingfile"/>        </asynclogger>        <asynclogger name="rollingfile2" level="trace" additivity="fal">            <appender-ref ref="rollingfile2"/>        </asynclogger>        <root level="debug">            <appenderref ref="console"/>            <appenderref ref="rollingfile"/>        </root>    </loggers></configuration>

党的宗旨java代码如下:

public class main {    public static void main(string args[]) {        //引用com.meituan.main日志输出器        logger logger = logmanager.getlogger(main.最新环保法class);        //引用的名为rollingfile2的异步asynclogger        logger logger2 = logmanager.getlogger("rollingfile2");        person person = new person("li", "lei");        logger.info("hello, {}", person);        logger2.info("good bye, {}", person);}

上述log4j2.xml中配置了两个asynclogger,名字分别为com.meituan.main和rollingfile2。

并且,在main方法中分别使用两个logger来输出两条日志。

在加载log4j2.xml的启动阶段,如果检测到配置了asyncroot或asynclogger,将启动一个disruptor实例。

log4j2异步注意事项

log4j2异步类型

1) 使用<async>标签

示例:

<async name="asynckafkalog">    <appenderref ref="failover" /></async>

注意事项: 此类异步队列是bockingqueue,队列默认大小是128

2) 使用<asynclogger>标签

示例:

<asynclogger name="kafkalogger" level="trace" includelocation="fal">    <appenderref ref="failover"/></asynclogger>

注意事项: 此类异步队列是disruptor队列默认大小是4096

3) 使用 jvm参数

示例:

#启动参数方式-dlog4jcontextlector=org.apache.logging.log4j.core.async.asyncloggercontextlector#代码方式system.tproperty("log4jcontextlector", "org.apache.logging.log4j.core.async.asyncloggercontextlector");

注意事项: 此类异步是全量异步,log4j配置文件里所有logger都自动异步,使用异步队列为disruptor,队列默认大小4096

小提示

① disruptor队列性能远胜于blockingqueue,这也是log4j2性能提升的重要原因之一

② 如果启用了全量异步,又使用了<asynclogger>会如何?

log4j2会新建两个disruptor队列,<asynclogger>之流使用一个,其他的使用另外一个,所以建议将可能发生阻塞的logger归类使用一个disruptor,毕竟是队列,一个阻塞了其他的得乖乖等着

③ 如果默认队列长度不足咋办?

#第一步:加大两个disruptor队列的长度-dasynclogger.ringbuffersize=262144-dasyncloggerconfig.ringbuffersize=262144  #第二步:设置队列满了时的处理策略:丢弃,否则默认blocking,异步就与同步无异了-dlog4j2.asyncqueuefullpolicy=discard

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 04:50:05,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/d1ce525f7dd2e64d7b123f4f80e0c4c5.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:关于log4j2的异步日志输出方式.doc

本文 PDF 下载地址:关于log4j2的异步日志输出方式.pdf

标签:队列   日志   方式   线程
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图