【问题标题】:Log4j2 AsyncLogger with rolling file appender not showing file line number带有滚动文件附加程序的 Log4j2 AsyncLogger 不显示文件行号
【发布时间】:2023-04-05 01:33:01
【问题描述】:

我正在使用具有以下依赖关系的 log4j2:

<!-- LOG4J2 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.0-rc1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.0-rc1</version>
    </dependency>
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>3.0.1</version>
    </dependency>

Log4j2.xml 内容:

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

<Appenders>
    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
    </Console>

    <!-- Generate rolling log for router with per hour interval policy -->
    <RollingFile name="ProcessorRollingFile" fileName="D:/ocsprocessor.log"
        filePattern="D:/ocsprocessor.log.%d{MM-dd-yyyy}-%i.log">
         <PatternLayout>
      <pattern>%d{ISO8601} [%t] %p %c %L - %m%n</pattern>
  </PatternLayout>
        <Policies>
            <TimeBasedTriggeringPolicy interval="1" />
        </Policies>
        <DefaultRolloverStrategy max="24" />
    </RollingFile>



    <!-- Register Async appender -->
    <Async name="AsyncRollingFile">
        <AppenderRef ref="ProcessorRollingFile" />
    </Async>
</Appenders>

<Loggers>
    <AsyncLogger name="com.tritronik.logger.log4j2" level="error"
        additivity="false">
        <AppenderRef ref="AsyncRollingFile" />
    </AsyncLogger>


</Loggers>
</Configuration>

结果一切都很好,除了日志没有显示抛出的记录器的行号(模式中的 %L)。

我搜索了一下,发现对于异步记录器和滚动文件附加器,没有提到使用 %L,那么我该如何实现呢?还是它不支持 %L?

编辑:我已尝试添加 includeLocation="true",但结果仍然相同

2014-05-23 11:42:40,368 [threadPoolTaskExecutor-5] ERROR (AsyncLogger:) - THIS IS TEST MESSAGE FOR LOGGING TEST PURPOSE

谢谢

【问题讨论】:

    标签: java logging log4j log4j2


    【解决方案1】:

    首先,移除Async appender,将AsyncLogger的appender-ref直接指向ProcessorLoggingFile。其次,您必须在 AsyncLogger 上添加 includeLocation="true"。

    除了异步记录器之外还有一个异步附加程序没有帮助,在这种情况下可能会阻止 includeLocation 正常工作。

    【讨论】:

    • 谢谢!!!它可以工作.. 但是,除了 async 记录器之外,还有 async appender 是怎么回事?
    • 如果您的应用程序记录到异步记录器,它实际上只是将日志事件放入队列(LMAX 中断器)。一个单独的线程将从队列中取出事件并将它们发送到附加程序。如果 appender 是异步的,则再次将事件放入队列中。最后,异步附加程序的线程将从该队列中取出事件并写入文件。所以其中之一是不必要的。 AsyncLoggers 要快得多,所以我建议删除 async appender。另外,如果您同时保留两者,则两者都需要 includeLocation (不确定这是否可行,未测试...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 2016-10-14
    • 2023-03-30
    相关资源
    最近更新 更多