Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Log4j2:以编程方式删除现有的appender,并为所有记录器动态添加新的RollingFileAppender_Logging_Log4j2_Programmatically_Rollingfileappender - Fatal编程技术网

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

Logging Log4j2:以编程方式删除现有的appender,并为所有记录器动态添加新的RollingFileAppender,logging,log4j2,programmatically,rollingfileappender,Logging,Log4j2,Programmatically,Rollingfileappender,我们需要在应用程序启动时以编程方式添加滚动文件追加器。 我还需要删除从log4j2.xml文件中配置的现有appender。 我尝试了各种方法,但都不管用 我现在面临的问题是: 一些日志仍在旧的Appender中。 如果我将logger levelfrom INFO更新为任何logger包的DEBUG,那么这些事情也不会正常进行。 LoggerContext LoggerContext=LoggerContext LogManager.getContextfalse; 配置=loggerCont

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

我现在面临的问题是:

一些日志仍在旧的Appender中。 如果我将logger levelfrom INFO更新为任何logger包的DEBUG,那么这些事情也不会正常进行。 LoggerContext LoggerContext=LoggerContext LogManager.getContextfalse; 配置=loggerContext.getConfiguration; //删除现有的附加器 configuration.getAppenders.keySet.forEachAbstractConfigurationconfiguration::removeAppender; 字符串rollingAppenderName=RollingAppender; RollingFileAppender RollingFileAppender=RollingFileAppender.newBuilder .setConfigurationconfiguration .setNamerollingAppenderName .setLayoutlayout .withFileName/tmp/test.log .withFilePattern/tmp/test.%i.log .WithPolicySizeBadeTriggeringPolicy.createPolicy10MB 建筑 rollingFileAppender.start; configuration.addAppenderrollingFileAppender; /* *正在更新log4j2配置文件中配置的所有LoggerConfig的附加器。 * */ LoggerConfig rootLogger=configuration.getRootLogger; Map loggerMap=configuration.getLoggers; 对于LoggerConfig LoggerConfig:loggerMap.values{ AppenderRef AppenderRef=AppenderRef.createAppenderRefrollingAppenderName、loggerConfig.getLevel、loggerConfig.getFilter; AppenderRef[]refs=新的AppenderRef[]{AppenderRef}; 如果是Objects.equalsloggerConfig.getName,则为rootLogger.getName{ loggerConfig=loggerConfig.RootLogger.createLoggertrue,loggerConfig.getLevel, Boolean.toStringGloggerConfig.isIncludeLocation,refs,null,configuration,loggerConfig.getFilter; loggerConfig.addAppenderrollingFileAppender、loggerConfig.getLevel、loggerConfig.getFilter; }否则{ loggerConfig=loggerConfig.createLoggertrue、loggerConfig.getLevel、loggerConfig.getName、, Boolean.toStringGloggerConfig.isIncludeLocation,refs,null,configuration,loggerConfig.getFilter; } configuration.RemoveloggerConfig.getName; configuration.addLoggerloggerConfig.getName,loggerConfig; } loggerContext.updateLogger;
你采取的方法是不正确的。试图以您目前的方式操纵现有配置将导致在您处理配置时丢失日志事件。相反,创建一个新配置,一旦构建完成,就用新配置替换旧配置。

这里我正在更新现有配置,因为我不想错过/丢失来自log4j2.xml文件的所有配置详细信息。然后将所需内容复制到新配置中。但是请注意,您可能必须克隆其中一些,因为旧配置关闭时它们可能会停止。如果我按照您所说的做,我将读取原始Log4j2.xml文件,删除附加器并将新附加器添加为xml,然后重新配置。使用xslt删除和添加xml很容易,尽管现在它已经有点过时了。你能详细说明你的方法吗。还有一点,我们对文件type.xml或.properties或.json或.ymlOK没有任何约束。为此,您应该使用原始配置文件创建一个新配置,方法是使用适当的参数调用ConfigurationFactory.getConfiguration,然后按照计划对其进行修改,除非您不应该启动任何组件并用指向Appender的组件替换任何AppenderRef。修改后,将其传递给LoggerContext的重新配置方法。