2017-09-23 82 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等級及以上的日誌。