SiftingAppender

Posted by Pismery Liu on Thursday, May 2, 2019

TOC

通过 Logback 的 SiftingAppender 实现按线程分配 log 文件 文件。

SiftingAppender

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <property name="USER_HOME" value="E:\\Workspace\\java\\idea\\study\\basic\\log" />
    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>threadGroupId</key>
            <defaultValue>unknown</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE-${threadGroupId}" class="ch.qos.logback.core.FileAppender">
                <file>${USER_HOME}/sift/SIFT-${threadGroupId}.log</file>
                <append>false</append>
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <pattern>%d [%thread] %level %mdc %logger{35} - %msg%n</pattern>
                </layout>
            </appender>
        </sift>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="SIFT"/>
    </root>
</configuration>
@Slf4j
public class LogbackDemo implements Runnable{

    private String counterName;

    public LogbackDemo(String counterName) {
        this.counterName = counterName;
    }

    public void run() {
        MDC.put("threadGroupId", counterName);
        log.info("start counter {}", counterName);
        MDC.remove("threadGroupId");
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; ++i) {
            executorService.execute(new LogbackDemo(String.valueOf(i)));
        }
        executorService.shutdown();
    }
}

运行结果下图