[Spring boot] logback으로 로그 관리하기

GyeongEun Kim·2022년 5월 16일
0

졸업 프로젝트 기능중에 사용자 로그를 분석하여 방문자의 나이대와 성별 통계를 그래프화 해서 보여주는 기능의 개발을 내가 맡게 되었다.

그래서 여태까지 로그 기능을 한번도 써본적이 없었는데 이 기회로 공부할 수 있게 되었다.

내가 개발한 기능에 대해 간략히 설명하자면

  1. 사용자가 특정 페이지에 방문한다.
  2. 사용자 아이디(u_id)방문한 페이지 번호(a_id)를 로그에 남긴다.
  3. 이를 하루 단위로 로그파일로 저장한다.
  4. 매일 생성된 파일을 자정마다 읽어들여 db table에 업데이트한다.

Logback

Logbacklog4j를 발전시킨 logging framework로 spring boot는 spring-boot-starter-web > spring-boot-starter-logging에 logback 구현체가 포함되어 있다.
그래서 의존성을 따로 추가하지 않아도 logback이 기본 로깅 구현체로 자동 적용된다.

이렇게 적용된 로깅 구현체는 SLF4J(Simple Logging Framework for JAVA : interface)와 compile시에 바인딩된다.

사용해보기

우선 Logger 객체를 생성하여준다.
Logger logger = LoggerFactory.getLogger(this.getClass());

나는 Service단에 printLog라는 함수를 만들고 이 함수를 Controller에서 호출했다.

//Service - 로그 찍는 메서드
public void printLog (Long u_id, Long a_id) {
        logger.info("u_id: "+u_id+" a_id: "+a_id);
        //log level 을 info로 지정
    }
    
//Controller
alcoholService.printLog(u_id, a_id); 

Log Level

로그 레벨은 5가지로 구성되며 오른쪽으로 갈수록 단계가 높아진다.

TraceDebugInfoWarnError

나는 위에서 로그 레벨을 info로 설정하였기 때문에 콘솔에 출력될때 ㅇㅇ 처럼 출력된다.

그렇다면 콘솔이 아니라 로그를 파일에 저장하는건 어떻게 할까?

logback-spring.xml 파일 작성

logback에 대한 여러 설정을 변경할 수 있게 resources/logback-spring.xml파일을 만든다.

<configuration scan="true" scanPeriod="30 seconds">
  
	  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{HH:mm:ss.SSS} [%-5level] - %msg%n</Pattern>
        </layout>
    </appender>
  
    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- Rolling 정책 -->  
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./logs/logback-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 7일까지 보관 -->
            <maxHistory>7</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
      
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
      
    </appender>
  


    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

    <logger name="graduation.alcoholic.web.board.alcohol" level="INFO">
        <appender-ref ref="ROLLING" />
    </logger>


</configuration>

appender

appender란 로그를 작성하는 일을 맡고 있는 객체로 이를 상속받는 객체들은 ConsoleAppender, FileAppender, RollingFileAppender가 있다. (어디에다가 작성할지 결정함!)

  • ConsoleAppender : 콘솔에 로그를 출력
  • FileAppender : 로그를 파일에 저장
  • RollingFileAppender : FileAppender를 상속하여 지정한 패턴에 따라 다른 파일에 로그가 저장될 수 있게함

Pattern

출력할 로그의 패턴을 정한다.

  • %-5level: 로그 레벨, -5는 출력의 고정폭 값(5글자)
  • %msg: - 로그 메시지

fileNamePattern

파일을 저장할 위치와 이름의 패턴을 정한다.

  • %d: 로그 기록시간 출력

maxHistory

보관할 최대 파일 수. 7로 설정하고 rollover는 일간이므로 7일이 지난파일들은 삭제됨

root/logger

실제 로깅을 수행하는 객체로 root는 최대 하나를 가질 수 있고 logger는 여러개를 가질 수 있으며 root를 상속받는다.

logback 공식문서 참고

위와같이 설정을 하면 logs폴더 안에 설정한 이름 규칙에 맞춰 하루 단위로 로그파일들이 생성된다.

파일내에는 이렇게 로그가 찍혀있다. 위에서 작성한 printLog()의 내용처럼 INFO level에 u_ida_id가 적혀있다.

이렇게 해서 logback으로 로그파일을 생성하는 방법을 얕게나마 알아보았다.
logback-spring.xml을 작성하려다 보니 logback의 구조에 대해 꽤나 자세히 찾아보게 되었는데 내용이 생각보다 방대했다. 그러나 공식 문서가 잘 돼있어서 괜찮았다.

앞으로 로그를 찍을 일이 많을텐데 그 때까지 까먹지 않는것이 목표이다😀

profile
내가 보려고 쓰는 글

1개의 댓글

comment-user-thumbnail
2023년 3월 24일

잘 보고 갑니다!

답글 달기