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

詳談異步log4j2中的location信息打印問題

 更新時(shí)間:2021年12月22日 17:00:16   作者:KeepTing  
這篇文章主要介紹了詳談異步log4j2中的location信息打印問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

異步log4j2的location信息打印問題

背景:項(xiàng)目改造過程中將log4j2改成異步,發(fā)現(xiàn)行號(hào)沒有打印,于是扒了下官方文檔,大概陳述下:

先說一下這個(gè)問題是怎么解決的,然后稍微擴(kuò)展一下其他配置,有興趣的可以往下看或者溜一遍官方文檔

說下解決

在<AsyncLogger>標(biāo)簽中配置includeLocation="true",

擴(kuò)展:

1、additivity:這個(gè)屬性的意思是需不需要打印此logger繼承的父logger,如果是false則只打印當(dāng)前l(fā)ogger;如果是true則繼續(xù)打印上一層的logger,直到root。

2、實(shí)現(xiàn)error日志打印雙份:info.log中打印一份(即info中包括info和error日志),error.log中打印一份(只包括error日志),這樣的好處是能根據(jù)error日志出現(xiàn)的上下文快速定位到程序bug出現(xiàn)的位置,這個(gè)功能需要使用過濾器實(shí)現(xiàn),比如:

 <RollingFile name="error" fileName="${log_home}/error.log" immediateFlush="false" append="true"
                     filePattern="/history/error-%d{yyyy-MM-dd}.log.gz">
      <Filters>
         <!--只允許級(jí)別為error的日志通過-->
          <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
       </Filters>
       <PatternLayout charset="UTF-8">
          <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} #| %p #| %t #| %c{-1}:%L #| %m%n</Pattern>
       </PatternLayout>
       <Policies>
          <!--默認(rèn)打印周期為一天-->
          <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
       </Policies>
       <!--保存日志個(gè)數(shù)為15個(gè)-->
       <DefaultRolloverStrategy max="15"/>
</RollingFile>

log4j2的異步形式大概分為兩種:全異步和同步異步混合。

1、全異步

實(shí)現(xiàn)方式:將系統(tǒng)屬性log4j2.contextSelector設(shè)置 為org.apache.logging.log4j.core.async.AsyncLoggerContextSelector,即

System.setProperty("log4j2.contextSelector, "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

或者在啟動(dòng)時(shí)設(shè)置:

-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

官方給出了一個(gè)不需要location信息的配置文件示例:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
    <RandomAccessFile name="RandomAccessFile" fileName="async.log" immediateFlush="false" append="false">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
      </PatternLayout>
    </RandomAccessFile>
  </Appenders>
  <Loggers>
   <!--不需要打印location信息-->
    <Root level="info" includeLocation="false">
      <AppenderRef ref="RandomAccessFile"/>
    </Root>
  </Loggers>
</Configuration>

注意:

如果用AsyncLoggerContextSelector實(shí)現(xiàn)全異步,那么配置中就要使用<root>和<logger> 。如果配置了這個(gè)屬性,并且使用了<asyncRoot>和<asyncLogger>,那么程序?qū)?huì)產(chǎn)生兩個(gè)線程:日志數(shù)據(jù)首先傳遞給線程A,然后線程A再傳遞給線程B,最后再輸出到磁盤,這樣是可行的,但是中間多了一步線程交互的過程,這是不必要的。

同步異步混合

相比起全異步,混合異步可能會(huì)花費(fèi)更多的性能,

官方給出了一個(gè)混合異步的配置例子:

<?xml version="1.0" encoding="UTF-8"?>

<!-- No need to set system property "log4j2.contextSelector" to any value
    when using <asyncLogger> or <asyncRoot>. -->

<Configuration status="WARN">
 <Appenders>
   <!-- Async Loggers will auto-flush in batches, so switch off immediateFlush. -->
   <RandomAccessFile name="RandomAccessFile" fileName="asyncWithLocation.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.foo.Bar" level="trace" includeLocation="true">
     <AppenderRef ref="RandomAccessFile"/>
   </AsyncLogger>
   <Root level="info" includeLocation="true">
     <AppenderRef ref="RandomAccessFile"/>
   </Root>
 </Loggers>
</Configuration>

對(duì)于location信息:

默認(rèn)情況下,異步日志記錄器不會(huì)將location信息傳遞給I/O線程,如果你的layouts或custom過濾器需要location信息,你需要在所有相關(guān)日志記錄器(包括根日志記錄器)的配置中設(shè)置“includeLocation=true”

如果其中一個(gè)layouts配置了關(guān)于位置的信息,比如HTML locationInfo,或者表達(dá)式%C或%class、%F或%file、%l或%location、%L或%line、%M或%method,log4j2將會(huì)獲取堆棧的快照(snapshot),并遍歷堆棧跟蹤以查找位置信息,因此會(huì)消耗較多的時(shí)間。

比同步logger慢1.3到5倍,同步日志記錄器在獲取堆??煺罩皶?huì)等待盡可能長(zhǎng)的時(shí)間,如果不需要位置,那么快照將永遠(yuǎn)不會(huì)被捕獲。

了解更多請(qǐng)?jiān)L問官方文檔:Apache Log4j2 Async 官方文檔

log4j2支持異步打印提高打印輸出速度

pom依賴添加

<!--log4j2異步支持-->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
</dependency>

全局模式2兩種

第一種:resources 下創(chuàng)建屬性文件 log4j2.component.properties

# log4j2異步支持
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

第二種:springboot啟動(dòng)main方法添加代碼

System.setProperty("Log4jContextSelector","org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");

或者采用啟動(dòng)參數(shù)

-DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

局部模式 AsyncLogger

<Loggers>
        <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>

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

相關(guān)文章

  • Spring常用配置及解析類說明

    Spring常用配置及解析類說明

    這篇文章主要介紹了Spring常用配置及解析類說明,涉及Spring常用配置項(xiàng)的方法以及它的解析類等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java中的字節(jié)流文件讀取教程(二)

    Java中的字節(jié)流文件讀取教程(二)

    這篇文章主要給大家介紹了關(guān)于Java中字節(jié)流文件讀取的相關(guān)資料,本文屬于之前文章的延長(zhǎng)篇,有需要的朋友可以先看看上一篇文章,相信會(huì)對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • Java 判斷IP地址的合法性實(shí)例詳解

    Java 判斷IP地址的合法性實(shí)例詳解

    這篇文章主要介紹了Java 判斷IP地址的合法性實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • spring mvc實(shí)現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    spring mvc實(shí)現(xiàn)文件上傳并攜帶其他參數(shù)的示例

    本篇文章主要介紹了spring mvc實(shí)現(xiàn)文件上傳并攜帶其他參數(shù)的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Mybatis逆向工程筆記小結(jié)

    Mybatis逆向工程筆記小結(jié)

    MyBatis官方為我們提供了一個(gè)逆向工程,通過這個(gè)逆向工程,只需要建立好數(shù)據(jù)表,MyBatis就會(huì)根據(jù)這個(gè)表自動(dòng)生成pojo類、mapper接口、sql映射文件,本文主要介紹了Mybatis逆向工程筆記小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • 淺談一下Java線程組ThreadGroup

    淺談一下Java線程組ThreadGroup

    ThreadGroup是為了方便線程管理出現(xiàn)了,可以統(tǒng)一設(shè)定線程組的一些屬性,比如setDaemon,設(shè)置未處理異常的處理方法,設(shè)置統(tǒng)一的安全策略等等,需要的朋友可以參考下
    2023-05-05
  • Java線程協(xié)調(diào)運(yùn)行操作實(shí)例詳解

    Java線程協(xié)調(diào)運(yùn)行操作實(shí)例詳解

    這篇文章主要介紹了Java線程協(xié)調(diào)運(yùn)行操作,結(jié)合具體實(shí)例形式詳細(xì)分析了Java線程協(xié)調(diào)運(yùn)行原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析

    Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析

    目前有個(gè)需求,需要使用不同的數(shù)據(jù)源,例如某業(yè)務(wù)要用A數(shù)據(jù)源,另一個(gè)業(yè)務(wù)要用B數(shù)據(jù)源,所以下面這篇文章主要給大家介紹了關(guān)于Springboot動(dòng)態(tài)切換數(shù)據(jù)源的具體實(shí)現(xiàn)與原理分析,需要的朋友可以參考下
    2021-12-12
  • 詳解在Spring Boot中使用JPA

    詳解在Spring Boot中使用JPA

    本篇文章主要介紹了詳解在Spring Boot中使用JPA,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • java把字符串寫入文件里的簡(jiǎn)單方法分享

    java把字符串寫入文件里的簡(jiǎn)單方法分享

    這篇文章主要介紹了java把字符串寫入到文件里的簡(jiǎn)單方法,這是跟一個(gè)外國(guó)朋友學(xué)的代碼,需要的朋友可以參考下
    2014-03-03

最新評(píng)論

星子县| 安远县| 双城市| 林口县| 海盐县| 姜堰市| 梅河口市| 和顺县| 阿荣旗| 阿拉善盟| 德江县| 咸丰县| 同仁县| 大英县| 常熟市| 徐汇区| 广南县| 卢龙县| 上饶县| 清涧县| 新兴县| 尚义县| 长乐市| 苏尼特右旗| 新乡县| 秀山| 隆回县| 临江市| 泗水县| 昭苏县| 蓝山县| 新田县| 云阳县| 阿城市| 平阴县| 宝丰县| 九江县| 额尔古纳市| 剑川县| 手机| 石林|