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
Java LOG4J2-如何以编程方式创建文件追加器?_Java_Logging_Log4j_Log4j2_Appender - Fatal编程技术网

Java LOG4J2-如何以编程方式创建文件追加器?

Java LOG4J2-如何以编程方式创建文件追加器?,java,logging,log4j,log4j2,appender,Java,Logging,Log4j,Log4j2,Appender,我需要以编程方式设置文件追加器 我想在log4j2.xml上设置appender,但我只想在运行时(以编程方式)写入其中一个appender <Configuration status="WARN"> <Appenders> <File name="File_1" fileName="c:/FILE_1.log" > <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l

我需要以编程方式设置文件追加器

我想在log4j2.xml上设置appender,但我只想在运行时(以编程方式)写入其中一个appender

<Configuration status="WARN">
<Appenders>
    <File name="File_1" fileName="c:/FILE_1.log" >
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <File name="File_2" fileName="c:/FILE_2.log" >
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
    <File name="File_3" fileName="c:/FILE_3.log" >
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>
</Appenders>
<Loggers>
    <Root level="debug">
        <AppenderRef ref="File_1"/>
        <AppenderRef ref="File_2"/>
        <AppenderRef ref="File_3"/>
    </Root>
</Loggers>
通过查看Internet上的各种教程,他们解释了如何在运行时以编程方式添加附加程序;有办法选择吗 在运行时,只有xml配置文件中定义的一个附加器

第一个解决方案:

     if(condition.equals("A")){
             //write log on File_1
         }else if(condition.equals("B")){
              //write log on File_2
         }else {
              //write log on File_3
         }
我试图用以下方法解决这个问题,但我对我的解决方案不满意,因为log4j2.xml中定义的文件不会以编程方式删除,而且第一个附加器也不会删除我认为log4j2中有一个bug:(状态已解决,但我不这么认为……我使用的是log4j-2.0-beta9)

static org.apache.logging.log4j.core.Logger coreLogger=
(org.apache.logging.log4j.core.Logger)LogManager.getLogger(MyClass.class.getName());
静态LoggerContext=(LoggerContext)coreLogger.getContext();
静态BaseConfiguration=(BaseConfiguration)context.getConfiguration();
静态字符串FILE_1=“FILE_1”;
静态字符串FILE_2=“FILE_2”;
静态字符串FILE_3=“FILE_3”;
私有静态映射appendersMap;
静止的
{
appenderMap=新的HashMap();
appenderMap.put(文件_1,true);
appenderMap.put(文件2,true);
appendersMap.put(文件3,true);
}
/**
*配置附加器。
*
*@param appender追加器
*/
公共静态无效配置追加器(字符串追加器){
if(appender.equals(FILE_1)){
addAppenders(文件1);
移除附件(文件2、文件3);
}
else if(appender.equals(FILE_3)){
addAppenders(文件3);
移除附件(文件1、文件2);
}
else if(appender.equals(FILE_2)){
addAppenders(文件2);
移除附件(文件1、文件3);
}
}
专用静态void addappender(字符串appender){
如果(!appenderMap.get(appender)){
appenderMap.put(appender,true);
addAppender(configuration.getAppender(appender));
}
}
专用静态void removeAppenders(字符串…追加器){
for(字符串追加器:追加器){
appenderMap.put(appender,false);
removeAppender(configuration.getAppender(appender));
}
}

我向log4j2团队报告了这个问题,他们告诉我他们很快就会解决


这个问题提出已经有一段时间了,有很多人要求为Log4j 2提供更好的编程配置。从Log4j 2.4开始,API被添加到Log4j core中,以方便使用

新的
ConfigurationBuilder
API允许用户构造组件定义。有了这个API,就不需要直接使用实际的配置对象(如LoggerConfig和FileAppender),它们需要大量关于Log4j如何在后台工作的知识。组件定义被添加到ConfigurationBuilder中,一旦收集了所有定义,所有实际的配置对象(如记录器和附加器)都将被构造。它感觉有点像XML配置语法,只是您正在编写Java代码

请注意,新的
ConfigurationBuilder
API允许用户代码创建新配置或完全替换现有配置。如果您的用例不同,并且您希望在Log4j启动后以编程方式修改(而不是替换)现有配置,那么您将需要使用实际的配置对象。在这种情况下,请参阅手册的章节

如果您确实需要直接使用内部配置对象,请注意,您需要在最后调用
LoggerContext.updateLogers()
Configurator.initialize(configuration)
,以使更改生效。例如:

final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
... // make changes
ctx.updateLoggers(); // NECESSARY!

这对我有用。不知道怎么做。我没有更新记录器,也没有重新配置上下文

    Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName());
    Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout();
    Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build();
    appender.start();
    coreLogger.addAppender(appender);

思科,伙计,你的代码帮了我很多。在看到你的代码之前,我无法附上我的附件。不确定,那你怎么能把它作为答案发布?好吧,它确实起到了作用。但是任何关于它如何工作的解释都是有用的。这是对这些伐木工人不必要的复杂的控诉,不是Ash真诚帮助的反映。太棒了!这正是我将遗留代码迁移到log4j2所需要的。手册的链接:“初始化后以编程方式修改当前配置”部分给出了几个示例,非常有用。
    Logger coreLogger = (Logger)LogManager.getLogger(LoggingStuff.class.getName());
    Layout layout = ((LoggerContext)LogManager.getContext()).getConfiguration().getAppender("Console").getLayout();
    Appender appender = FileAppender.newBuilder().withName("File").withFileName("target/bash.log").withLayout(layout).build();
    appender.start();
    coreLogger.addAppender(appender);