티스토리 뷰

Overviews

예전에는 logback 이용할려면 디펜던시를 뭐뭐 추가해주고 뭐뭐 빼줘야 하고 복잡했던거 같은데 스프링부트에서는 할게없네요. 

그냥 설정만 잘 잡아 주면 되는거 같습니다. 

spring profile에 따라 설정을 분리하는 것과 실행 시 조건에 따른 설정을 만들어 보겠습니다. 더불어 롬복으로 처리하는 것까지 예제를 만들어 보겠습니다. 


Dependencies

1
2
3
4
5
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
cs

logback 테스트는 위의 디펜던시면 충분합니다. 

그런데 로그 처리시 조건을 추가할려면  'org.codehaus.janino:janino:3.0.12' 가 추가해야 합니다. 

더불어 롬복 디펜던시도 추가 ~~~ 


1
2
3
4
5
6
7
8
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.codehaus.janino:janino:3.0.12'
    implementation("org.projectlombok:lombok:1.18.6")
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
cs

설정 

application.properties 

1
spring.profiles.active=qa
cs

profile 테스트를 위해 설정합니다. 저는 dev/qa/release 이렇게 했습니다. 

Properties 추가 

  • logback-dev.properties
  • logback-qa.properties
  • logback-release.properties
logback-dev.properties
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
#logback 설정
#로그파일  DEV/QA/RELEASE
log.config.mode=DEV
#로그파일 저장 분기 ZIP이면 ZIP파일로 저장 LOG이면 LOG파일로 일자별 저장
#log.config.savemode=ZIP
log.config.savemode=LOG
#ZIP모드일 경우에만 사용
#로그파일 최소 개수
log.config.min=1
#로그파일 최대 개수
log.config.max=10
#로그파일 사이즈
log.config.filesizezip=10MB
#ZIP모드일 경우에만 사용
#LOG모드일 경우에만 사용
#로그파일 기간설정
log.config.days=10
#로그파일 사이즈
log.config.filesizelog=100MB
#로그파일 최대 최대 사이즈
log.config.totalfilesize=10GB
#LOG모드일 경우에만 사용
#공통 설정
#프로젝트 패키지 명
log.config.packagename=eblo
#로그파일 경로
log.config.path=/logs/eblo
#로그파일 이름
log.config.filename=eblo-dev
 
cs

logback-spring.xml 추가 

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?xml version="1.0" encoding="UTF-8"?>
 
<!-- 30초마다 설정 파일의 변경을 확인한다. 파일이 변경되면 다시 로딩한다 -->
<configuration scan="true" scanPeriod="30 seconds">
    
    <!-- setting -->
    <springProfile name="qa">
        <property resource="logback-qa.properties"/>
    </springProfile>
    <springProfile name="dev">
        <property resource="logback-dev.properties"/>
    </springProfile>
    <springProfile name="release">
        <property resource="logback-release.properties"/>
    </springProfile>
    
    <!-- log packagename -->
    <property name="LOG_PACKAGE_NAME" value="${log.config.packagename}"/>
    <!-- log file path -->
    <property name="LOG_PATH" value="${log.config.path}"/>
    <!-- log file name -->
    <property name="LOG_FILE_NAME" value="${log.config.filename}"/>
    <!-- log days -->
    <property name="LOG_DAYS" value="${log.config.days}"/>
    <!-- log filesize log -->
    <property name="LOG_FILESIZE_LOG" value="${log.config.filesizelog}"/>
    <!-- log filesize zip -->
    <property name="LOG_FILESIZE_ZIP" value="${log.config.filesizezip}"/>
    <!-- log filesize total -->
    <property name="LOG_TOTAL_FILESIZE" value="${log.config.totalfilesize}"/>
    <!-- log min count -->
    <property name="LOG_FILE_MIN" value="${log.config.min}"/>
    <!-- log max count -->
    <property name="LOG_FILE_MAX" value="${log.config.max}"/>
    <!-- pattern -->
    <property name="LOG_PATTERN"
              value="%-5level %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line] - %msg%n"/>
 
    <property name="LOG_PATTERN_LIVE"
              value="%-5level %d{yy-MM-dd HH:mm:ss} [%method:%line] - %msg%n"/>
 
    <!-- console log -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
 
    <!-- 로그 파일 생성 관련 -->
    <!-- 로그 모드 -->
    <!-- log file -->
    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log
            </fileNamePattern>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <if condition='property("log.config.mode").equals("RELEASE")'>
        <then>
            <logger name="${LOG_PACKAGE_NAME}" level="INFO"/>
        
            <logger name="org.springframework" additivity="false">
                <level value="WARN"/>
                <appender-ref ref="console"/>
            </logger>
        
            <root level="INFO">
                <appender-ref ref="console"/>
                <appender-ref ref="FILE"/>
            </root>
        </then>
        <else>
            <logger name="${LOG_PACKAGE_NAME}" level="INFO"/>
 
            <logger name="jdbc.resultset" additivity="false">
                <level value="INFO"/>
                <appender-ref ref="console"/>
            </logger>
        
            <logger name="org.springframework" additivity="false">
                <level value="INFO"/>
                <appender-ref ref="console"/>
            </logger>
        
            <root level="INFO">
                <appender-ref ref="console"/>
            </root>
        </else>
    </if>
        
</configuration>
cs

소스를 보면 상단에 spring profile에 따라 properties를 가져오는 부분이 있고 하단에 조건에 따른 설정 부분이 있습니다. 

두 곳 참고하면 원하는 처리를 할 수 있습니다. 

예제

Controller 일반 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RestController
public class UserTestController {
 
    private static final Logger logger = LoggerFactory.getLogger(UserTestController.class);
    
    @GetMapping("/test")
    public String test() {
        logger.info("test");
        logger.warn("test");
        logger.error("test");
        
        return "test";
    }
    
}
cs


결과

INFO  19-02-26 13:20:03 [UserTestController:15] - test

WARN  19-02-26 13:20:03 [UserTestController:16] - test

ERROR 19-02-26 13:20:03 [UserTestController:17] - test


Controller - Lombok

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RestController
@Slf4j
public class LombokTestController {
 
    @GetMapping("/lombok-test")
    public String test() {
        log.info("test");
        log.warn("test");
        log.error("test");
        
        return "test";
    }
    
}
cs


결과

INFO  19-02-26 13:19:58 [LombokTestController:14] - test

WARN  19-02-26 13:19:58 [LombokTestController:15] - test

ERROR 19-02-26 13:19:58 [LombokTestController:16] - test

Test

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
@RunWith(SpringRunner.class)
@SpringBootTest
public class LombokTestControllerSpringTest {
 
    @Rule
    public OutputCapture outputCapture = new OutputCapture();
 
    @Autowired
    protected WebApplicationContext context;
 
    protected MockMvc mockMvc;
    
    @Before
    public void setup() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
    }
 
    @Test
    public void testController() throws Exception {
        this.mockMvc.perform(get("/lombok-test"))
        .andExpect(status().isOk());
 
        this.outputCapture.expect(containsString("LombokTestController:14] - test"));
    }
 
}
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
public class LombokTestControllerTest {
 
    @Rule
    public OutputCapture outputCapture = new OutputCapture();
 
    @Test
    public void testLoadedCustomLogbackConfig() throws Exception {
        LombokTestController controller = new LombokTestController();
        controller.test();
        this.outputCapture.expect(containsString("LombokTestController"));
    }
 
}
cs

참고 

PatternLayout 등 설정 참고

- https://logback.qos.ch/manual/layouts.html


Github 링크 : https://github.com/kkaok/examples

댓글
댓글쓰기 폼