SIFT Appender 를 사용하여 로그 분기처리

 

[설정]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8"?>
 
<configuration>
 
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level] : %msg%n</Pattern>
        </encoder>
    </appender>
 
    <appender name="TST" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level]-%msg%n</Pattern>
        </encoder>
    </appender>
 
    <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
        <discriminator>
            <key>discr</key>
            <defaultValue>type</defaultValue>
        </discriminator>
        <sift>
            <appender name="FILE-${discr}" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>/${discr}.log</file>
                <layout class="ch.qos.logback.classic.PatternLayout">
                    <Pattern>%d [%thread] %level %mdc %logger{35} SIFT- %msg%n</Pattern>
                </layout>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <fileNamePattern>/${discr}_%d{yyyy-MM-dd-HH-mm}.%i.log</fileNamePattern>
                </rollingPolicy>
            </appender>
        </sift>
    </appender>
 
 
    <logger name="jpabook.jpashop.service.OrderService" level="error" additivity="false">
        <!--<appender-ref ref="TST"/>-->
        <appender-ref ref="SIFT"/>
    </logger>
 
    <root level="debug">
        <appender-ref ref="CONSOLE"/>
    </root>
 
 
</configuration>
cs

 

[테스트]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import org.slf4j.MDC;
 
@Slf4j
public class Sample {
    public void testLog(){
        MDC.put("discr""TYP1");
        //log.
        log.trace("test trace");
        log.debug("test debug");
        log.info("test info");
        log.warn("test warn");
        log.error("test error");
 
        MDC.put("discr""TYP2");
        log.error("test error222");
    }
}
cs

 

[결과]

 

* ThreadPool 사용시 MDC key값을 전달받지 못함.

 : MDC.setContextMap 으로 key 값 전달가능

 참고 : https://stackoverflow.com/questions/6073019/how-to-use-mdc-with-thread-pools

 

* slf4j MDC 를 사용하지 않더라도, strategy pattern 과 같은 디자인 패턴을 사용하고, 분기처리할 구현체에 logger 를 지정하여 패키지 경로마다 별도 로그 파일 및 별도 경로의 로그파일에 로그 적재가 가능할 듯.

 

반응형

+ Recent posts