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

Java 如何以编程方式从log4j2中删除ConsoleLogger?,java,spring,log4j2,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"/> <T

我要在整个项目中继承一个全局记录器配置:

<?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>
问题:仅打印
{DefaultConsole-2=DefaultConsole-2}

问题:为什么我不能在这里看到
应用程序
控制台
附件?而且,我怎样才能删除控制台附加器呢

也许可以以某种方式截取log4j上下文加载,这样我就可以通过编程跳过控制台附加器了

旁注:我的日志记录如下,在生产中应该只转到
应用程序
附加器,而不是控制台

private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
LOGGER.info("test");
对于Console Appender中的
,您可以添加环境变量
或类似的内容,并将此变量设置为
关闭
。我也面临着这个问题,它对我很有效

这也适用于vm参数,如下所示:

<ThresholdFilter level="${sys:console.log.level}" ... />
对于编程方法来说,最重要的是
SpringApplication
上下文必须先初始化!否则,配置的记录器将不可见

对于控制台附件中的
,您可以添加环境变量
或类似的内容,并将此变量设置为
关闭
。我也面临着这个问题,它对我很有效

这也适用于vm参数,如下所示:

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

对于编程方法来说,最重要的是
SpringApplication
上下文必须先初始化!否则,配置的记录器将不可见

为什么不能为生产部署不同的日志配置文件?我相信配置文件的位置可以通过系统属性更改。我知道,但我不想复制日志配置,只是为了删除
行。因为这只是一个例子,在我的实际项目中,日志文件也要复杂得多。因此,关于未来的维护,我更希望不必复制配置…为什么不能为生产部署不同的日志配置文件?我相信配置文件的位置可以通过系统属性更改。我知道,但我不想复制日志配置,只是为了删除
行。因为这只是一个例子,在我的实际项目中,日志文件也要复杂得多。因此,关于未来的维护,我更希望不必复制配置…我是否可以通过编程方式更改此级别?我更喜欢spring
@Profile(“production”)
配置方法,而不是在目标系统上设置一个变量(系统正在重建时可能会忘记)。我是否可以通过编程方式更改此级别?我更喜欢spring
@Profile(“production”)
配置方法,而不是必须在目标系统上设置一个变量(在重建系统时可能会忘记)。
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();
}