[Spring] Slf4j, logback 사용해 로그 찍기

19·2022년 7월 20일
0

Spring

목록 보기
3/29

coco 프로젝트 사용자 피드백 기간을 앞두고, 로그를 파일로 저장해서 로그 관리를 해보라는 튜터님의 피드백이 있었다.

스프링 부트에 로그를 찍는 방법은 log4j, logback, log4j2가 있는데, 우리 팀은 logback을 사용하기로 했다.

  1. log4j는 2015년에 개발이 중단되어서 제외
  2. log4j2가 성능면에서 우수하나 21년 12월 기능 이슈가 있었고, 관련 레퍼런스도 logback보다 적다는 자료들을 많이 봐서 log4j2 제외

Logback은 'org.springframework.boot:spring-boot-starter-web'에 구현되어 있기 때문에 따로 의존성을 추가해주지 않아도 된당


설정

logback-spring.xml 파일을 작성한다. (로그를 어떻게 찍어줄 지를 커스텀해주는 역할)

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!--로그 파일 저장 위치-->
    <property name="LOGS_PATH" value="C:/coco_log/"/>>
    <!-- 지정한 일자/시간마다 파일을 생성하면서 로그를 찍는다-->
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>  <!-- 로그 레벨 지정하는 부분-->
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <!-- 일자와 시간,분까지 지정했기때문에 1분마다 로그 파일이 생성된다.-->
            <fileNamePattern>${LOGS_PATH}log-%d{yyyy-MM-dd_HH_mm}.%i.txt</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 로그 파일을 몇 개 생성할 건지-->
            <maxHistory>10</maxHistory>
        </rollingPolicy>

        <encoder>
            <!-- 찍어줄 로그의 형태, 시간과 로그가 찍힌 메소드, 메세지가 출력된다.-->
            <pattern>[%-5level] %d{HH:mm:ss.SSS} %logger{36} %M - %msg%n</pattern>
        </encoder>

    </appender>
    <root level="debug">
        <appender-ref ref="ROLLING"/>
    </root>
</configuration>

<fileNamePattern>${LOGS_PATH}log-%d{yyyy-MM-dd_HH_mm}.%i.txt</fileNamePattern>부분이 이해가 잘 가지 않았는데 정리를 해보면,

  • yyyy-MM-dd까지만 있으면 하루 간격으로 로그 파일이 생성된다.
  • yyyy-MM-dd-HH까지 있으면 1시간 간격으로 로그 파일이 생성된다.
  • YYYY-mm-dd-HH-mm까지 있으면 1분 간격으로 로그 파일이 생성된다.

이 때 maxHistory값에 따라 몇 개의 로그 파일이 생성될 지가 결정되는데,
위의 예시로는 10으로 설정되어 있는데, 매 분마다 로그파일이 생성하되, 10개까지만! 생성된다.



사용

로그를 찍어줄 부분을 정해준다.
ex)

...
@Slf4j
public class PostService {

    ...
    // 게시글 생성
    @Transactional
    public ResponseEntity<PostSaveResponseDto> createPost(PostSaveRequestDto postSaveRequestDto, MemberDetails memberDetails) {
        ...
        // 게시글 길이 2000자 제한
        if (postSaveRequestDto.getContent().length() > 2000) {
            log.error("nickname={}, error={}", member.getNickname(), "게시글 길이 2000자 초과");
            ...
        }
        ...
    }
    ...
}
  • 로그를 찍기 위해서는 @Slf4j 어노테이션을 붙여주어야 한다.
  • 로그를 찍고 싶은 부분에 log.error로 선언해준다.

※ log.error뿐만 아니라, trace, debug, info, warn등이 있다.

위의 예시는 Dto에서 넘어오는 content가 2000자가 넘으면 로그를 찍도록 한 것이다.
로그를 찍을 때, 사용자의 닉네임과 에러메시지를 넣어 주었다.

위의 설정에 따라 1분마다 로그 파일이 생성된다.
만약 2000자가 넘으면 로그가 찍히고 이는 파일에 저장된다.


결과?

위의 xml에서의 설정대로 분마다 로그파일이 저장되는 것을 확인할 수 있다.


Post의 content가 2000자가 넘어서 에러 로그가 찍혔다.
쪽지는 255자가 넘으면 에러 로그를 찍도록 했는데 정상적으로 찍혀서 파일에 저장된 것을 확인할 수 있다.

profile
하나씩 차근차근

0개의 댓글