如何解决异步log4j2中的位置信息打印问题

技术异步log4j2中的location信息打印问题怎么解决异步log4j2中的location信息打印问题怎么解决,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习

很多新手对于如何解决异步log4j2中的位置信息打印问题不是很清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。

00-1010背景:项目改造过程中,log4j2改为异步,发现没有打印行号,于是将正式文件剥离下来,大致陈述如下:

先说说这个问题是怎么解决的,然后再稍微扩展一下其他配置。如果你感兴趣,你可以往下看或翻看官方文件。

00-1010在AsyncLogger标记中配置includeLocation='true ',

扩展:

1.可加性:该属性表示是否需要打印该记录器继承的父记录器;如果为假,将只打印当前记录器;如果为真,继续打印记录器的前一层,直到根。

2.打印两份错误日志:一份打印在info.log中(即info包含信息和错误日志),一份打印在error.log中(仅包含错误日志)。这样做的好处是可以根据错误日志出现的上下文快速定位程序错误的位置。此功能需要通过使用过滤器来实现,例如:

rolling filename=' error ' filename=' $ { log _ home }/error . log ' immediate flush=' false ' append=' true '

file pattern='/history/error-% d { yyyy-MM-DD } . log . gz '

过滤

!-仅允许具有错误级别的日志通过-

ThresholdFilterlevel=' error ' on match=' ACCEPT ' onismatch=' DENY '/

/过滤器

PatternLayoutcharset='UTF-8 '

模式% d { yyyy-MM-ddhh :MM :s。SSS } # | % p # | % t # | % c {-1 } :% L # | % m % n/Pattern

/PatternLayout

政策

!-默认打印周期为一天-

TimeBasedTriggeringPolicyinterval=' 1 ' modulate=' true '/

/政策

!-保存的日志数是15-

DefaultRolloverStrategymax=' 15 '/

/RollingFilelog4j2的异步形式大致可以分为两种:完全异步和同步异步混合。

异步log4j2的location信息打印问题

实施:将

系统属性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>

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/155760.html

(0)

相关推荐

  • 顺序志愿,学考志愿填报顺序重要吗

    技术顺序志愿,学考志愿填报顺序重要吗重要的,一般是按顺序录取,所以第一志愿很重要顺序志愿。考生要按照招生专业对选考科目的要求填报志愿,只有符合选考科目要求才能报考相应专业。考生须熟知平行志愿投档原则。平行志愿投档时按照“

    生活 2021年10月31日
  • 编程语言的优缺点对比的实例分析

    技术编程语言的优缺点对比的实例分析编程语言的优缺点对比的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  python作为一门高级编程语言,它的诞生

    攻略 2021年11月16日
  • 送老师鲜花禁忌,老师生病了,我该送什么呢

    技术送老师鲜花禁忌,老师生病了,我该送什么呢考虑到老师的身体还没有完全恢复,胃口也不好,送营养品不是很实用,出院的时候还增加行李负担。不妨看望他的时候送一些鲜花,鲜花可以调节他的心情,心情好了,身体也能够快速恢复。但是老

    生活 2021年10月25日
  • 香港云服务器:为什么您的博客需要香港云主机

    技术香港云服务器:为什么您的博客需要香港云主机您知道在运营博客类网站的时候为什么选择的云服务器很重要吗?让我们来看看稳定的香港云服务器对于博客类网站的实际作用,以及它如何与整个网站正常运营息息相关。虽然每个博客都会有所不

    礼包 2021年10月19日
  • 四氯化碳的密度,碘水加四氯化碳什么现象

    技术四氯化碳的密度,碘水加四氯化碳什么现象碘水加四氯化碳,静止后液体分为两层,上层为浅黄色或者无色液体,下层为紫色四氯化碳的密度。上层的浅黄色液体为含有少量碘的水溶液,下层的紫色为碘的四氯化碳溶液。溶液分层是因为水和四氯

    生活 2021年10月23日
  • SPARK2和Phoenix集成的方法是什么?

    技术SPARK2与Phoenix整合的方法是什么本篇内容主要讲解“SPARK2与Phoenix整合的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SPARK2与Ph

    攻略 2021年12月16日