Log4j2 AsyncLogger,滚动文件appender没有显示文件行号

Lyn*_*777 8 java logging log4j log4j2

我使用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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

事实证明一切都很顺利,除了日志没有显示抛出的记录器的行号(模式中的%L).

我用谷歌搜索,发现对于异步记录器和滚动文件appender,没有人提到使用%L,那么我怎么能实现呢?或者它不支持%L?

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

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

谢谢

Rem*_*pma 13

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

除了异步记录器之外还有一个异步appender也无济于事,在这种情况下可能会阻止includeLocation正常工作.

  • 如果您的应用程序登录到异步记录器,它基本上只会将日志事件放入队列(LMAX干扰器).一个单独的线程将事件从队列中取出并将它们发送到appender.如果appender是异步的,则事件再次被放入队列中.最后,异步appender的线程将事件从该队列中取出并写入该文件.所以其中一个是不必要的.AsyncLogger要快得多,所以我建议删除异步appender.此外,如果您同时保留两者,则需要includeLocation(不确定是否可行,未经测试...) (2认同)