java - 如何以编程方式从 log4j2 中删除 ConsoleLogger?

标签 java spring 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");

最佳答案

对于<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />在 Console Appender 中,您可以添加环境变量 <ThresholdFilter level="${CONSOLE_LOG_LEVEL}" onMatch="ACCEPT" onMismatch="DENY" />或类似的东西,并将此变量设置为 OFF 。我也面临这个问题,它对我有用。

这也适用于虚拟机参数,如下所示:

<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上下文必须先初始化!否则配置的记录器不可见!

关于java - 如何以编程方式从 log4j2 中删除 ConsoleLogger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56885393/

相关文章:

java - 启动 log4j2.properties 的配置片段?

java - 如何更改此 fragment

java - 使用 Spring Batch 从数据库表中部分提取

java - Spring boot PropertySourcesPlaceHolderConfigurer 与 @ProperySource

java - Spring 与 JSON 前缀配置有关的问题

java - Log4j2 MarkerFilter 包含无效元素或属性 "onMismatch"

java - 使用 Java 检查系统的互联网连接

java - 使用 Smack XMPP 发送内嵌图像

java - 如何解决 : javax. servlet.ServletException : java. lang.NoClassDefFoundError: javax/xml/ws/soap/SOAPFaultException

java - 在 Eclipse 控制台中显示 Log4J2 输出