如何以编程方式从 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
appender。
由于 log4j2.xml
配置文件不支持条件,我考虑过以编程方式删除控制台附加程序:
final LoggerContext context = (LoggerContext) LogManager.getContext(false);
final Configuration config = context.getConfiguration();
System.out.println(config.getAppenders());
问题:这只打印 {DefaultConsole-2=DefaultConsole-2}
问题:为什么我在这里看不到 APP
或 CONSOLE
appender?而且,我怎样才能删除控制台附加程序呢?
也许可以拦截 以某种方式加载 log4j 上下文,以便我可以以编程方式跳过 CONSOLE appender?
旁注:我正在记录如下,在生产中应该只转到 APP
appender,而不是控制台。
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
LOGGER.info("test");
对于 Console 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
上下文!否则配置的记录器不可见!
我有一个全局记录器配置,我想在我的整个项目中继承它:
<?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
appender。
由于 log4j2.xml
配置文件不支持条件,我考虑过以编程方式删除控制台附加程序:
final LoggerContext context = (LoggerContext) LogManager.getContext(false);
final Configuration config = context.getConfiguration();
System.out.println(config.getAppenders());
问题:这只打印 {DefaultConsole-2=DefaultConsole-2}
问题:为什么我在这里看不到 APP
或 CONSOLE
appender?而且,我怎样才能删除控制台附加程序呢?
也许可以拦截 以某种方式加载 log4j 上下文,以便我可以以编程方式跳过 CONSOLE appender?
旁注:我正在记录如下,在生产中应该只转到 APP
appender,而不是控制台。
private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
LOGGER.info("test");
对于 Console 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
上下文!否则配置的记录器不可见!