当前位置: 首页 > 知识库问答 >
问题:

Log4j2:以编程方式删除现有的应用程序,并为所有记录器动态添加新的RollingFileAppender

赵永逸
2023-03-14

我们需要在应用程序启动时以编程方式添加滚动文件追加器。我还需要删除现有的appender(从log4j2.xml文件配置)。我尝试了各种方法,但都不管用。

我现在面临的问题是:

  1. 一些日志仍在旧的Appender中
  2. 如果我为任何记录器包更新记录器级别(从INFO到DEBUG),这些事情也不会正常进行
java prettyprint-override">        LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
        Configuration configuration = loggerContext.getConfiguration();

        //Removing the existing appenders
        configuration.getAppenders().keySet().forEach(((AbstractConfiguration)configuration)::removeAppender);
        
        String rollingAppenderName = "RollAppender";
        RollingFileAppender rollingFileAppender = RollingFileAppender.newBuilder()
                .setConfiguration(configuration)
                .setName(rollingAppenderName)
                .setLayout(layout)
                .withFileName("/tmp/test.log")
                .withFilePattern("/tmp/test.%i.log")
                .withPolicy(SizeBasedTriggeringPolicy.createPolicy("10MB"))
                .build();
        rollingFileAppender.start();
        configuration.addAppender(rollingFileAppender);

        /*
         * Updating appenders of all the loggerConfigs configured in the log4j2 config file.
         * */
        LoggerConfig rootLogger = configuration.getRootLogger();
        

        Map<String, LoggerConfig> loggerMap = configuration.getLoggers();
        for (LoggerConfig loggerConfig : loggerMap.values()) {
            AppenderRef appenderRef = AppenderRef.createAppenderRef(rollingAppenderName, loggerConfig.getLevel(), loggerConfig.getFilter());
            AppenderRef[] refs = new AppenderRef[]{appenderRef};
            if (Objects.equals(loggerConfig.getName(), rootLogger.getName())) {
                loggerConfig = LoggerConfig.RootLogger.createLogger("true", loggerConfig.getLevel(),
                        Boolean.toString(loggerConfig.isIncludeLocation()), refs, null, configuration, loggerConfig.getFilter());
                loggerConfig.addAppender(rollingFileAppender, loggerConfig.getLevel(), loggerConfig.getFilter());
            } else {
                loggerConfig = LoggerConfig.createLogger(true, loggerConfig.getLevel(), loggerConfig.getName(),
                        Boolean.toString(loggerConfig.isIncludeLocation()), refs, null, configuration, loggerConfig.getFilter());
            }

            configuration.removeLogger(loggerConfig.getName());
            configuration.addLogger(loggerConfig.getName(), loggerConfig);
        }

        loggerContext.updateLoggers();

共有1个答案

薛博艺
2023-03-14

你采取的方法是不正确的。试图以您目前的方式操纵现有配置将导致在您处理配置时丢失日志事件。相反,创建一个新的配置,一旦构建完成,就用新配置替换旧配置。

 类似资料:
  • 我知道:- 但是,createAppender和createLogger是V2.11中不推荐使用的方法。 此外,我还知道ConfigurationBuilder。我已经试用了它,它似乎是为了以编程方式构建配置。我需要从log4j2.xml文件中获得默认配置。并追加新的追加器(带有新的文件名和记录器)。

  • 通话录音API在Android 9上已经不起作用了 入境的 在新的Android 9操作系统中,它内置了自动通话记录功能。解决这个问题的办法是使用默认的电话系统应用程序,启用自动记录所有通话。 到目前为止,仅记录了手动步骤,如下所述: Vivo 转到“设置” 小米步骤可能会有所不同 三星步骤可能不同 需要以编程方式实现这一点 > 我正在寻找一种解决方案,以编程方式执行此步骤,同时考虑所有移动属性。

  • 问题内容: 我有一对多关系的两个数据库表。数据如下所示: 结果集: 我想删除所有应用程序,但最新的除外。换句话说,每个学生都只能将一个应用程序链接到该应用程序。使用上面的示例,数据应如下所示: 我将如何构造我的DELETE语句以过滤出正确的记录? 问题答案: 考虑到评论中的长时间讨论,请注意以下几点: 上面的语句 将 在任何正确实现语句级读取一致性的数据库上运行,而不管语句运行时对表的任何更改。

  • 问题内容: 有没有一种方法可以在运行时从家庭启动器中删除活动?我的意思是从其属性或类似的东西删除。 问题答案: 您可以通过禁用组件,将其从启动器中删除。

  • 我正在使用 Log4j2。要求是,如果记录器无法写入日志文件(访问被拒绝、锁定等),则应用程序应关闭。 我编写了以下类来实现这一点: 我用下面的代码以编程方式构建我的文件记录器: 现在我的问题: 我知道在Log4j 1。X.X版本向日志程序添加一个错误处理程序是非常容易的。您可以简单地这样做: 如何在Log4j2版本2.13.3中使用上面的代码执行此操作?

  • 我正在使用log4j2 v2.17.2,需要在运行时以编程方式添加记录器/附加器。我正在创建LoggerConfig,如下所示:https://logging . Apache . org/log4j/2 . x/manual/custom config . html部分:初始化后以编程方式修改当前配置 包括此片段: 当使用:LoggerConfig.createLogger(..)(现在我用构建