我的编程空间,编程开发者的网络收藏夹
学习永远不晚

log4j2异步日志输出方式有几种

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

log4j2异步日志输出方式有几种

小编给大家分享一下log4j2异步日志输出方式有几种,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

log4j2的异步日志输出方式

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

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

Log4j2中的异步日志实现方式有AsyncAppender和AsyncLogger两种。

其中:

  • AsyncAppender采用了ArrayBlockingQueue来保存需要异步输出的日志事件;

  • AsyncLogger则使用了Disruptor框架来实现高吞吐。

第一种实现异步方式AsyncAppender

AsyncAppender直接在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>                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>                <SizeBasedTriggeringPolicy 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的常用参数

参数名类型说明
nameStringAsync Appender的名字
AppenderRefString异步调用的Appender的名字,可以配置多个
blockingboolean默认为true。如果为true,appender将一直等待直到queue中有空闲;如果为false,当队列满的时候,日志事件将被丢弃。(如果配置了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>                <SizeBasedTriggeringPolicy 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>                <SizeBasedTriggeringPolicy size="500MB"/>            </Policies>        </RollingFile>    </Appenders>    <Loggers>    <!--上面的配置都和原配置一样,就是在下方这直接定义AsyncLogger,他的name在java类中被引用即可-->        <AsyncLogger name="com.meituan.Main" level="trace" additivity="false">            <appender-ref ref="RollingFile"/>        </AsyncLogger>        <AsyncLogger name="RollingFile2" level="trace" additivity="false">            <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="false">    <AppenderRef ref="Failover"/></AsyncLogger>

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

3) 使用 JVM参数

示例:

#启动参数方式-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector#代码方式System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

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

小提示

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

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

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

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

#第一步:加大两个Disruptor队列的长度-DAsyncLogger.RingBufferSize=262144-DAsyncLoggerConfig.RingBufferSize=262144  #第二步:设置队列满了时的处理策略:丢弃,否则默认blocking,异步就与同步无异了-Dlog4j2.AsyncQueueFullPolicy=Discard

以上是“log4j2异步日志输出方式有几种”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

log4j2异步日志输出方式有几种

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

log4j2异步日志输出方式有几种

小编给大家分享一下log4j2异步日志输出方式有几种,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!log4j2的异步日志输出方式使用log4j2的同步日志进行日志
2023-06-22

javascript中有几种输出方式

这篇文章给大家分享的是有关javascript中有几种输出方式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被称为JavaScript
2023-06-14

Springboot异常日志输出方式的示例分析

小编给大家分享一下Springboot异常日志输出方式的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/sette
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录