为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

对于<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY" />在 Console Appender 中,您可以添加环境变量<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必须先初始化上下文!否则配置的记录器不可见!


查看完整回答
反对 回复 2023-03-09
  • 1 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信