[英]Mixed Synchronous and Asynchronous Loggers not working - log4j2
使用log4j2,我正在努力使同步記錄器和異步記錄器一起工作。
從此處獲取示例Apache文檔 (在“混合同步和異步記錄器”的標題下)並在下面運行該應用程序將僅創建日志文件,但不向其寫入任何內容。 我也不確定要添加兩個指向同一個附加程序的記錄器,但是它是Apache文檔,因此我認為可以。
LOG4J2配置
<?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>
的pom.xml
<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>
應用
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();
}
}
但是,如果我更改log4j2配置並修改loggers元素以讀取以下內容,則將在日志文件中獲得預期的輸出。
<Loggers>
<AsyncRoot name="com.foo.Bar" level="trace" includeLocation="true">
<AppenderRef ref="RandomAccessFile"/>
</AsyncRoot>
</Loggers>
我需要的
理想情況下,我希望類似以下內容的工作。 但是,此配置只會將行中的內容打印出來並創建日志文件,而不會將內容寫入其中。 我想念什么?
<?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>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<!--write to file - i dont care when it happens-->
<AsyncLogger level="trace" includeLocation="true">
<AppenderRef ref="RandomAccessFile"/>
</AsyncLogger>
<!--Async so the console messages appear in the order expected-->
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
因為在第一個LOG4J2 Config中,您的根記錄程序的級別為“ info”。 而在main方法中,您正在做logger.trace()。 參考文檔: https : //logging.apache.org/log4j/2.0/manual/architecture.html
它們代表級別命令。
萬一Asyncroot
您將級別更改為“ trace”。 這就是為什么它起作用。 再一次,當您將添加器添加為控制台時,您將獲得level =“ trace”。
您正在使用root logger,因為沒有logger名稱“ HelloWorld”,默認情況下它將為您提供root logger。
嘗試使用logger.info()。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.