簡體   English   中英

如何以編程方式從log4j2中刪除ConsoleLogger?

[英]How to remove the ConsoleLogger programmatically from log4j2?

我要在整個項目中繼承一個全局記錄器配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %p %c{1.}: %m%n"/>
            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />
        </Console>

        <RollingRandomAccessFile name="APP" fileName="/logs/application.logs" filePattern="/logs/application-%d{yyyy-MM-dd}.log.gz">
            <PatternLayout pattern="%d %p %c{1.}: %m%n"/>
            <Filters>
                <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="APP" />
            <AppenderRef ref="CONSOLE" />
        </Root>
    </Loggers>
</Configuration>

問題:僅在生產中,我要刪除記錄器之一CONSOLE附加程序。

由於log4j2.xml配置文件不支持條件,因此我考慮過以編程方式刪除控制台附加程序:

final LoggerContext context = (LoggerContext) LogManager.getContext(false);
final Configuration config = context.getConfiguration();
System.out.println(config.getAppenders());

問題:僅打印{DefaultConsole-2=DefaultConsole-2}

問題:為什么我在這里看不到APPCONSOLE附加程序? 而且,我該如何刪除控制台附加程序?

也許可以以某種方式截獲 log4j上下文加載,以便我可以以編程方式跳過CONSOLE附加程序?

旁注:我的日志記錄如下,在生產中,該記錄僅應轉到APP附加程序,而不要進行控制台。

private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
LOGGER.info("test");

對於控制台Appender中的<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" /> ,您可以添加環境變量<ThresholdFilter level="${CONSOLE_LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" />或類似的東西,並將此變量設置為OFF 我也面臨這個問題,它對我有用。

這也適用於vm args,如下所示:

<ThresholdFilter level="${sys:console.log.level}" ... />

啟動應用程序時: java -jar -Dconsole.log.level=ERROR

旁注:通過編程,刪除控制台附加程序也可以:

public static void main(String[] args) {
    ctx = SpringApplication.run(MyApp.class, args);

    final LoggerContext context = (LoggerContext) LogManager.getContext(false);
    final Configuration config = context.getConfiguration();
    LoggerConfig loggerConfig = config.getLoggerConfig("loggerName");
    loggerConfig.removeAppender("CONSOLE");
    context.updateLoggers();
}

對於編程方法,最重要的是必須在初始化SpringApplication上下文之前! 否則,配置的記錄器將不可見!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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