Logback - отдельный файл журнала для каждого потока

Logback - отдельный файл журнала для каждого потока

logback-different-log-for-each-thread

В этом руководстве мы покажем вам, как использовать LogbackMapped Diagnostic Context (MDC) иSiftingAppender для создания отдельного файла журнала для каждого потока.

P.S Tested with Logback 1.1.2, should work in earlier version.

Note
Дополнительная информация, обратитесь к этомуLogback MDC documentation

1. logback.xml example

Файлlogback.xml, чтобы показать вам, как объявить и настроитьSiftingAppender иMDC.

logback.xml




    

    

        
        
        
            logFileName
            head0
        

        

          
          
            ${USER_HOME}/${logFileName}.log

            
                
                    %d{yyyy-MM-dd HH:mm:ss} %mdc [%thread] %level %logger{35} - %msg%n
                
            

            
                ${USER_HOME}/${logFileName}.%i.log.zip
                
                1
                10
            

            
                10MB
            

          

        
    

    
        
            
                %-5level %logger{36} - %msg%n
            
        
    

    
        
        
    

    
        
    

2. Пример потоков Java

Простой пример потока, объявлено значение "logFileName" черезMDC.put

Head.java

package com.example.analyzer.core;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

public class Head implements Runnable {

    static Logger logger = LoggerFactory.getLogger(Head.class);

    private String name;

    @Override
    public void run() {

        MDC.put('logFileName', getName());

        logger.debug("hello");

        //remember remove this
        MDC.remove('logFileName');

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Начать 10 потоков

    int count = 1;
    while(count<=10){
        Head head = new Head();
        head.setName("head-" + count);
        threadPools.execute(head);
        count++;
    }

Вывод: 10 отдельных файлов журнала для 10 потоков.

logback-different-log-for-each-thread

Note
С помощью этой функции MDC вы даже можете записывать вывод в отдельный файл журнала для каждого пользователя, вошедшего в систему, каждого запроса URI, каждого удаленного хоста и т. д.

Рекомендации