最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于log4j2的異步日志輸出方式

 更新時(shí)間:2021年12月22日 11:55:51   作者:在路上奔跑~  
這篇文章主要介紹了關(guān)于log4j2的異步日志輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

log4j2的異步日志輸出方式

使用log4j2的同步日志進(jìn)行日志輸出,日志輸出語(yǔ)句與程序的業(yè)務(wù)邏輯語(yǔ)句將在同一個(gè)線程運(yùn)行。

而使用異步日志進(jìn)行輸出時(shí),日志輸出語(yǔ)句與業(yè)務(wù)邏輯語(yǔ)句并不是在同一個(gè)線程中運(yùn)行,而是有專(zhuān)門(mén)的線程用于進(jìn)行日志輸出操作,處理業(yè)務(wù)邏輯的主線程不用等待即可執(zhí)行后續(xù)業(yè)務(wù)邏輯。

Log4j2中的異步日志實(shí)現(xiàn)方式有AsyncAppender和AsyncLogger兩種。

其中:

  • AsyncAppender采用了ArrayBlockingQueue來(lái)保存需要異步輸出的日志事件;
  • AsyncLogger則使用了Disruptor框架來(lái)實(shí)現(xiàn)高吞吐。

第一種實(shí)現(xiàn)異步方式AsyncAppender

AsyncAppender直接在log4j2的xml的配置文件中配置,注意下面代碼的注釋位置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
  <Appenders>
    <!--正常的Appender配置,此處配置的RollingFile會(huì)在下面AsyncAppender被通過(guò)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>
    <!--一個(gè)Appender配置完畢-->
    <!--異步AsyncAppender進(jìn)行配置直接引用上面的RollingFile的name-->
    <Async name="Async">
      <AppenderRef ref="MyFile"/>
    </Async>
    <!--異步AsyncAppender配置完畢,需要幾個(gè)配置幾個(gè)-->
  </Appenders>
  <Loggers>
    <Root level="error">
      <!--此處如果引用異步AsyncAppender的name就是異步輸出日志-->
      <!--此處如果引用Appenders標(biāo)簽中RollingFile的name就是同步輸出日志-->
      <AppenderRef ref="Async"/>
    </Root>
  </Loggers>
</Configuration>

重點(diǎn)內(nèi)容全在上面代碼的注釋中,AsyncAppender的配置就在xml文件中實(shí)現(xiàn),無(wú)需單獨(dú)引用包來(lái)支持.配置AsyncAppender后,日志事件寫(xiě)入文件的操作將在單獨(dú)的線程中執(zhí)行。

AsyncAppender的常用參數(shù)

參數(shù)名 類(lèi)型 說(shuō)明
name String Async Appender的名字
AppenderRef String 異步調(diào)用的Appender的名字,可以配置多個(gè)
blocking boolean 默認(rèn)為true。如果為true,appender將一直等待直到queue中有空閑;如果為false,當(dāng)隊(duì)列滿(mǎn)的時(shí)候,日志事件將被丟棄。(如果配置了error appender,要丟棄的日志事件將由error appender處理)
bufferSize integer 隊(duì)列中可存儲(chǔ)的日志事件的最大數(shù)量,默認(rèn)為128

第二種實(shí)現(xiàn)異步方式AsyncLogger

Log4j2中的AsyncLogger的內(nèi)部使用了Disruptor框架。

Disruptor簡(jiǎn)介

Disruptor是英國(guó)外匯交易公司LMAX開(kāi)發(fā)的一個(gè)高性能隊(duì)列,基于Disruptor開(kāi)發(fā)的系統(tǒng)單線程能支撐每秒600萬(wàn)訂單。

目前,包括Apache Strom、Log4j2在內(nèi)的很多知名項(xiàng)目都應(yīng)用了Disruptor來(lái)獲取高性能。

Disruptor框架內(nèi)部核心數(shù)據(jù)結(jié)構(gòu)為RingBuffer,其為無(wú)鎖環(huán)形隊(duì)列。

Disruptor為什么這么快?

  • lock-free-使用了CAS來(lái)實(shí)現(xiàn)線程安全
  • 使用緩存行填充解決偽共享問(wèn)題

首先在pom單中應(yīng)用相關(guān)的包

<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類(lèi)中被引用即可-->
        <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中配置了兩個(gè)AsyncLogger,名字分別為com.meituan.Main和RollingFile2。

并且,在main方法中分別使用兩個(gè)logger來(lái)輸出兩條日志。

在加載log4j2.xml的啟動(dòng)階段,如果檢測(cè)到配置了AsyncRoot或AsyncLogger,將啟動(dòng)一個(gè)disruptor實(shí)例。

log4j2異步注意事項(xiàng)

log4j2異步類(lèi)型

1) 使用<Async>標(biāo)簽

示例:

<Async name="asyncKafkaLog">
    <AppenderRef ref="Failover" />
</Async>

注意事項(xiàng): 此類(lèi)異步隊(duì)列是BockingQueue,隊(duì)列默認(rèn)大小是128

2) 使用<AsyncLogger>標(biāo)簽

示例:

<AsyncLogger name="kafkaLogger" level="trace" includeLocation="false">
    <AppenderRef ref="Failover"/>
</AsyncLogger>

注意事項(xiàng): 此類(lèi)異步隊(duì)列是Disruptor隊(duì)列默認(rèn)大小是4096

3) 使用 JVM參數(shù)

示例:

#啟動(dòng)參數(shù)方式
-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
#代碼方式
System.setProperty("Log4jContextSelector", "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

注意事項(xiàng): 此類(lèi)異步是全量異步,log4j配置文件里所有l(wèi)ogger都自動(dòng)異步,使用異步隊(duì)列為Disruptor,隊(duì)列默認(rèn)大小4096

小提示

① Disruptor隊(duì)列性能遠(yuǎn)勝于BlockingQueue,這也是log4j2性能提升的重要原因之一

② 如果啟用了全量異步,又使用了<AsyncLogger>會(huì)如何?

  • log4j2會(huì)新建兩個(gè)Disruptor隊(duì)列,<AsyncLogger>之流使用一個(gè),其他的使用另外一個(gè),所以建議將可能發(fā)生阻塞的logger歸類(lèi)使用一個(gè)Disruptor,畢竟是隊(duì)列,一個(gè)阻塞了其他的得乖乖等著

③ 如果默認(rèn)隊(duì)列長(zhǎng)度不足咋辦?

#第一步:加大兩個(gè)Disruptor隊(duì)列的長(zhǎng)度
-DAsyncLogger.RingBufferSize=262144
-DAsyncLoggerConfig.RingBufferSize=262144  
#第二步:設(shè)置隊(duì)列滿(mǎn)了時(shí)的處理策略:丟棄,否則默認(rèn)blocking,異步就與同步無(wú)異了
-Dlog4j2.AsyncQueueFullPolicy=Discard

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類(lèi)

    使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類(lèi)

    這篇文章主要介紹了使用spring動(dòng)態(tài)獲取接口的不同實(shí)現(xiàn)類(lèi),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java使用PageInfo的list通用分頁(yè)處理demo

    java使用PageInfo的list通用分頁(yè)處理demo

    這篇文章主要為大家介紹了java使用PageInfo的list通用分頁(yè)處理demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2023-12-12
  • Java中如何取出String字符串括號(hào)中的內(nèi)容

    Java中如何取出String字符串括號(hào)中的內(nèi)容

    這篇文章主要介紹了Java中如何取出String字符串括號(hào)中的內(nèi)容問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了Spring Cloud Gateway不同頻率限流(每分鐘,每小時(shí),每天),需要的朋友可以參考下
    2020-10-10
  • Spring的編程式事務(wù)TransactionTemplate的用法詳解

    Spring的編程式事務(wù)TransactionTemplate的用法詳解

    TransactionTemplate提供了一種在代碼中進(jìn)行編程式事務(wù)管理的方式,使開(kāi)發(fā)人員能夠在方法級(jí)別定義事務(wù)的開(kāi)始和結(jié)束點(diǎn),本文介紹了Spring框架中TransactionTemplate的用法,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • 淺談mybatis mapper.xml文件中$和#的區(qū)別

    淺談mybatis mapper.xml文件中$和#的區(qū)別

    這篇文章主要介紹了淺談mybatis mapper.xml文件中$和#的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • springboot全局日期格式化的兩種方式

    springboot全局日期格式化的兩種方式

    這篇文章主要介紹了springboot全局日期格式化的兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java 垃圾回收機(jī)制詳解(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java 垃圾回收機(jī)制詳解(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    在系統(tǒng)運(yùn)行過(guò)程中,會(huì)產(chǎn)生一些無(wú)用的對(duì)象,這些對(duì)象占據(jù)著一定的內(nèi)存,如果不對(duì)這些對(duì)象清理回收無(wú)用對(duì)象的內(nèi)存,可能會(huì)導(dǎo)致內(nèi)存的耗盡,所以垃圾回收機(jī)制回收的是內(nèi)存。下面通過(guò)本文給大家詳細(xì)介紹java垃圾回收機(jī)制,一起學(xué)習(xí)吧
    2017-02-02
  • Java鏈表中添加元素的原理與實(shí)現(xiàn)方法詳解

    Java鏈表中添加元素的原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java鏈表中添加元素的原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Java實(shí)現(xiàn)鏈表中添加元素的相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • Java異常詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java異常詳解_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    異常是Java語(yǔ)言中的一部分,它代表程序中由各種原因引起的“不正?!币蛩?。下面通過(guò)本文給大家介紹java異常的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-06-06

最新評(píng)論

理塘县| 东海县| 内丘县| 田林县| 剑阁县| 榕江县| 南华县| 延边| 巨鹿县| 嘉义市| 石景山区| 望江县| 奉贤区| 龙口市| 阳原县| 邻水| 兴安盟| 海淀区| 泗水县| 榆社县| 平泉县| 兰考县| 盐城市| 九龙坡区| 竹山县| 绥棱县| 玛纳斯县| 遵义县| 永泰县| 东兰县| 大厂| 闸北区| 石柱| 富裕县| 民县| 江孜县| 东山县| 长乐市| 藁城市| 岢岚县| 赣榆县|