如何在logback中为不同的追加器配置不同的级别,但在同一记录器下



我们正在编写 2 个追加器,将不同格式的日志写入 2 个不同的文件。 但我们希望根据某些配置启用这些日志。

因此,如果用户想要启用这两种格式,则将打印两种日志。但是,如果用户想要禁用一个日志,则不应创建该日志。

以下是我的记录器配置:

<logger name="package.name" additivity="false" level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="json_logs"/>
<appender-ref ref="text_logs"/>
</logger>

现在我想为这个追加器引用放置单独的级别,这些级别的值应该来自某个属性文件,该文件将由用户编辑,或者用户可以简单地更新logback.xml文件。

我无法找到为这些附加器设置单独级别的方法。 而且由于我必须从相同的类编写日志,所以我也不能创建 2 个单独的记录器。

此外,如果用户不想看到 txt 日志,则不应创建相应的 log.txt 文件。

你所追求的是阈值过滤器,它可以为每个追加器进行微调:

http://logback.qos.ch/manual/filters.html#thresholdFilter

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
...
</appender>

至于根本不根据某些标志写入文件...您可以编写自己的追加器。像这个超简单的例子,可以通过多种方式进行改进,但希望能让你入门:

public class ConditionalAppender<E> extends OutputStreamAppender<E> {
private boolean masterSwitch;
private String file;
@Override
public void start() {
if(masterSwitch)
setOutputStream(new FileOutputStream(file));
else 
setOutputStream(new NullOutputStream());
super.start();
}
public void setMasterSwitch(final boolean enabled) {
this.masterSwitch = enabled;
}
public void setFile(final String file) {
this.file = file;
}
}
<appender name="CONDITIONAL" class="mypackage.ConditionalAppender">
<!-- switch this appender on or off -->
<masterSwitch>true</masterSwitch>
<!-- set the output file -->
<file>/var/log/app/app.log</file>
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
...
</appender>

希望这有帮助。

相关内容

最新更新