簡體   English   中英

混合同步和異步記錄器不起作用-log4j2

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM