使用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>
答案 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()。