2017-09-23 72 views
1

here如何在log4j2的手动代码配置中为appender添加关卡?

你不需要申报单独记录器来实现这一点。您可以在上设置AppenderRef元素的日志记录级别。

和XML的例子(部分):

<Root level="trace"> 
    <AppenderRef ref="file" level="DEBUG"/> 
    <AppenderRef ref="STDOUT" level="INFO"/> 
</Root> 

但我不能找到一个方法来做到这一点,当我创建自己的配置。比如我有consoleAppenderBuilder和rootLoggerBuilder:

AppenderComponentBuilder consoleAppenderBuilder = builder 
    .newAppender("Stdout", "CONSOLE") 
    .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); 

RootLoggerComponentBuilder rootLoggerBuilder = builder 
    .newRootLogger(Level.ERROR) 
    .add(builder.newAppenderRef("Stdout")); 

如何添加控制台附加目的地到根日志记录,并定义日志级别的附加目的地。我问这是因为我想添加多个appender到根记录器。

+0

据我所知,你想知道如何以编程方式配置appender级别,但感觉这可能是[XY问题](https://meta.stackexchange.com/a/66378),因为你可能不是真的需要进行编程配置才能达到您想要的结果。你能解释一下为什么你想用这种方式配置log4j2吗?如果你可以避免编程配置,那么你可以防止你的代码依赖于log4j2实现,而是依赖于公共接口,从长远来看可以为你节省一些麻烦。 –

回答

1

下面是一个方法设定日志级别的每个AppenderRootLogger -

AppenderComponentBuilder consoleAppenderBuilder = builder 
    .newAppender("Stdout", "CONSOLE") 
    .addAttribute("target", ConsoleAppender.Target.SYSTEM_OUT); 

RootLoggerComponentBuilder rootLoggerBuilder = builder 
    .newRootLogger(Level.ALL) 
    .add(builder.newAppenderRef("Stdout").addAttribute("level", Level.INFO)); 

如果您有多个追加程序,下面的代码可以工作 -

RootLoggerComponentBuilder rootLoggerBuilder = builder 
    .newRootLogger(Level.ALL) 
    .add(builder.newAppenderRef("Stdout").addAttribute("level", Level.INFO)).add(builder.newAppenderRef("fileAppender").addAttribute("level", Level.ERROR)); 

的唯一一点要记住的是Appender日志级别可以降低logger中给出的日志级别,但不能提高日志级别。

假设在上述实例中,在初始化RootLogger水平是Level.ALLStdout附加器,它是Level.INFO。因此,它将打印INFO级别及以上的日志(WARN,ERROR)。然而,如果RootLoggerLevel.INFOStdout appender有Level.All,在这种情况下,它也将会打印INFO等级及以上的日志。