본문 바로가기
프로그래밍/SpringBoot

[스프링 부트 게시판] 로그 설정하기

by 소소로드 2020. 9. 25.

로그 설정하기


로그를 설정하는 근본적인 이유는 오류/에러 상황을 제대로 잘 파악하기 위해서이다.
또한, 매번 sysout으로 로그를 찍는 것은 리소스를 낭비한다고 볼수 있다.

스프링부트는 기본적으로 Logback, Log4j2, java utill logging을 지원하는데
내가 사용하려는 Logback은 SLF4J의 구현체이자 스프링 부트의 기본 로그 객체라고 볼 수 있고
다른 로그 성능과 비교했을 때 Logback의 성능이 확연히 좋다고 한다.

처음 스프링부트 프로젝트를 만들었을 때 spring-boot-starter-web 안에
이미 spring-boot-starter-logging가 있기 때문에 별다른 디펜던시 추가 없이 이용이 가능하다.

Logback의 로그 레벨은 TRACE > DEBUG > INFO > WARN > ERROR


1. 간단한 로그 설정

스프링부트가 아닐 경우는 logback관련 디펜던시를 따로 추가해줘야 하지만
스프링부트는 로그백이 기본적으로 설정되어 있어서 별도의 라이브러리가 필요없다.
이미 spring-boot-starter-web안에 logging 관련 구현체가 있기 때문.

다른 것은 필요없고 그냥 쓰고 싶은 클래스에서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class test() {
 
Logger logger = LoggerFactory.getLogger(컨트롤러 이름.class);
        logger.trace("trace -- Hello world.");
        logger.debug("debug -- Hello world.");
        logger.info("info -- Hello world.");
        logger.warn("warn -- Hello world.");
        logger.error("error -- Hello world.");
 
}
 
 
cs

이렇게만 해주면 받아올 수 있다.



2. application.properties를 통한 로깅 커스터마이징

(1) application.propertiest에서

#logging config
logging.config=classpath:logback-config.xml 이 부분을 추가해준다.


(2) resource 폴더 밑에도 동명의 logback-config.xml파일을 하나 만들어준다.
spring boot 로그백은 기본적으로 logback-spring이라는 이름을
설정파일을 읽어간다고 한다. 물론 다른 이름을 쓰고 싶다면 프로퍼티스로 변경도 가능


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
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />
    <!-- 해당 설정파일에서 사용될 값을 정의. LOGS_ABSOLUTE_PATH(절대 경로)-->
 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{36} - %msg%n</Pattern>
        </layout>
    </appender>
 
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>5MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>
 
    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
 
    <logger name="org.springframework.web" level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </logger>
    
    
    <!-- 로그 용어 정리 -->
<!--     *appender : 어디에, 어떻게 로그를 찍을 것인지에 대한 설정
    
    -appender의 class 종류
    ConsoleAppender : 콘솔에 로그를 찍는 방법
    FileAppender : 파일에 로그를 찍는 방법
    RollingFileAppender : 여러개의 파일을 순회하면서 로그를 찍는 방법(설정할 게 많음.)
    SMTPAppender : 로그를 메일에 찍어 보내는 방법
    DBAppender : 데이터베이스에 로그를 찍는 방법
    
    -appender의 Pattern 종류
    1. %Logger{length} - Logger name을 축약할 수 있다. {length}는 최대 자리 수
    2. %thread - 현재 Thread 이름
    3. %-5level - 로그 레벨, -5는 출력의 고정폭 값
    4. %msg - 로그 메시지 (=%message)
    5. %n - new line
    6. ${PID:-}- 프로세스 아이디
    
    %d : 로그 기록시간
    %p : 로깅 레벨
    %F : 로깅이 발생한 프로그램 파일명
    %M : 로깅일 발생한 메소드의 이름
    %l : 로깅이 발생한 호출지의 정보
    %L : 로깅이 발생한 호출지의 라인 수
    %t : 쓰레드 명
    %c : 로깅이 발생한 카테고리
    %C : 로깅이 발생한 클래스 명
    %m : 로그 메시지
    %r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간
    
    *logger : 해당 appender를 참조하여 해당 로거가 사용될 패키지와 로그레벨을 설정
    
    -log level의 종류는 위에서 명시했듯
    ERROR < WARN < INFO < DEBUG < TRACE
    
    해당 레벨 이하의 것은 다 찍는다.
    즉, INFO 레벨로 지정하면 INFO, WARN, ERROR 로그가 찍히고, 
    WARN 레벨로 지정하면 WARN, ERROR 로그가 찍힌다.
    TRACE, DEBUG 레벨로 찍을 경우 로그가 상당히 많이 찍히므로 주의해야한다.
 -->
    
</configuration>
cs

나는 로깅 커스터마이징을 통해 로그를 만들었고, 해당 내용은
내 입맛에 맞게 재정의해서 쓰는 것이 가장 좋을 것 같다.