混合同步和异步记录器无法正常工作 - log4j2

时间:2017-07-12 11:14:28

标签: java asynchronous logging log4j2

使用log4j2,我很难让同步记录器和异步记录器一起工作。

从这里获取示例Apache Documentation(在混合同步和异步记录器标题下)并运行下面的应用程序将只创建日志文件但不写任何内容。我也不确定是否添加两个指向同一个appender的记录器,但是它的Apache文档,所以我假设没问题。

LOG4J2配置

import requests
import json

url = 'http://scala.kimerucore.be:8080/ContentManager/api/rest/playlists/findByName/CameraDetectie'
r = requests.get(url)
print(json.loads(r.content))

的pom.xml

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

<!-- No need to set system property "Log4jContextSelector" 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>

应用

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>com.lmax</groupId>
        <artifactId>disruptor</artifactId>
        <version>3.3.6</version>
    </dependency>
</dependencies>

但是,如果我更改log4j2配置并修改loggers元素以阅读下面的内容,我会在日志文件中获得预期的输出。

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Main {
    public static void main(String[] args) {
        Logger logger = LogManager.getLogger("HelloWorld");
        for(int i = 0; i < 20; i++){
            logger.trace(String.format("Hello number %d", i));
        }
        LogManager.shutdown();
    }
}

我需要什么

理想情况下,我想要以下类似的工作。但是,此配置只会将行打印到控制台并创建日志文件,但不会将内容写入其中。我错过了什么?

<Loggers>
    <AsyncRoot name="com.foo.Bar" level="trace" includeLocation="true">
        <AppenderRef ref="RandomAccessFile"/>
    </AsyncRoot>
</Loggers>

1 个答案:

答案 0 :(得分:0)

因为在第一个LOG4J2 Config中,根记录器的级别为&#34; info&#34;。 而在main方法中,你正在做logger.trace()。 请参阅文档:https://logging.apache.org/log4j/2.0/manual/architecture.html

它们代表级别订单。

如果Asyncroot您将级别更改为&#34; trace&#34;。这就是它工作的原因。 再次当你将appender添加为控制台时,你就得到了level =&#34; trace&#34;。

您正在获取根记录器,因为没有记录器名称&#34; HelloWorld&#34;,默认情况下它会为您提供根记录器。

尝试使用logger.info()。