中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

異步log4j2中的location信息打印問題怎么解決

發布時間:2021-12-22 20:18:34 來源:億速云 閱讀:302 作者:柒染 欄目:開發技術

異步log4j2中的location信息打印問題怎么解決,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

異步log4j2的location信息打印問題

背景:項目改造過程中將log4j2改成異步,發現行號沒有打印,于是扒了下官方文檔,大概陳述下:

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

說下解決

在<AsyncLogger>標簽中配置includeLocation="true",

擴展:

1、additivity:這個屬性的意思是需不需要打印此logger繼承的父logger,如果是false則只打印當前logger;如果是true則繼續打印上一層的logger,直到root。

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

 <RollingFile name="error" fileName="${log_home}/error.log" immediateFlush="false" append="true"
                     filePattern="/history/error-%d{yyyy-MM-dd}.log.gz">
      <Filters>
         <!--只允許級別為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>
          <!--默認打印周期為一天-->
          <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
       </Policies>
       <!--保存日志個數為15個-->
       <DefaultRolloverStrategy max="15"/>
</RollingFile>

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

1、全異步

實現方式:將系統屬性log4j2.contextSelector設置 為org.apache.logging.log4j.core.async.AsyncLoggerContextSelector,即

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

或者在啟動時設置:

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

官方給出了一個不需要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實現全異步,那么配置中就要使用<root>和<logger> 。如果配置了這個屬性,并且使用了<asyncRoot>和<asyncLogger>,那么程序將會產生兩個線程:日志數據首先傳遞給線程A,然后線程A再傳遞給線程B,最后再輸出到磁盤,這樣是可行的,但是中間多了一步線程交互的過程,這是不必要的。

同步異步混合

相比起全異步,混合異步可能會花費更多的性能,

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

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

對于location信息:

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

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

比同步logger慢1.3到5倍,同步日志記錄器在獲取堆棧快照之前會等待盡可能長的時間,如果不需要位置,那么快照將永遠不會被捕獲。

了解更多請訪問官方文檔:Apache Log4j2 Async 官方文檔

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

pom依賴添加

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

全局模式2兩種

第一種:resources 下創建屬性文件 log4j2.component.properties

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

第二種:springboot啟動main方法添加代碼

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

或者采用啟動參數

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

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽宁省| 丹东市| 昭苏县| 敖汉旗| 万盛区| 武川县| 甘孜| 海盐县| 张家川| 奉节县| 高青县| 昌吉市| 芜湖县| 廉江市| 华池县| 喀喇沁旗| 古蔺县| 凤翔县| 城市| 黄龙县| 山丹县| 华坪县| 石棉县| 洪雅县| 信丰县| 克什克腾旗| 武功县| 安远县| 新晃| 叙永县| 浦东新区| 延寿县| 留坝县| 宝山区| 宾川县| 桐城市| 涪陵区| 武山县| 特克斯县| 陵川县| 桑日县|