如何为不同的附加程序配置不同级别,但在登录时在同一记录器下

时间:2019-08-13 04:22:33

标签: json spring spring-boot logging 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>

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

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

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

1 个答案:

答案 0 :(得分:0)

您需要的是ThresholdFilter,可以对每个附加程序进行微调:

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>

希望这会有所帮助。