항해99/개발일지

20220326 개발일지 #로그를 남겨보자

paran21 2022. 3. 30. 01:13

NodeJS에서 무중단 배포를 구현하기 위해 PM2를 사용하였는데, 로그가 저장된다는 사실을 알았다!

error log와 내가 console.log로 설정해놓은 로그들이 파일로 저장된다!

PM2 logrotate를 사용해서 매일매일 저장하게 설정해놓았다.

 

그리고 log에 timestamp를 찍어놨는데.... 문제는 이게 한국시간으로 저장이 안된다는 거다!!

(TIL을 밀려쓰고 있는 지금도 심지어 해결하지 못했다....)

서버 시간은 분명 KST인데 로그는 계속 UTC로 기록되고 있다...

 


nodeJS에서는 이제 최소한 오류 로그는 확인할 수 있으니, 다음으로 Spring에서 로그를 찍는 법을 찾아봤다.

Springboot에서는 기본으로 제공하는 Logback을 사용할 수 있다.

 

Springboot쪽에는 따로 system.out.println를 출력하는 부분은 없지만 에러와 HTTP 통신 기록을 남길 수 있는 Access 로그를 남기고 싶었다.

 

Logback은 따로 dependencies가 필요하지 않지만 access log를 남기기 위해서는 Gradle 기준으로 다음을 추가하면 된다.

implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'

그리고 기본 설정도 logback은 logback-spring.xml에서, access log는 logback-access.xml에서 설정해준다.

pm2 logrotate와 유사하게 여기서도 날짜별로 파일이 저장되도록 만들어주었다.

 

로그레벨은 info 정도면 적당할 것 같다.

application.properties에 설정해주었다.

logging.level.root=info

 

 

그런데 문제는 logback-access가 파일로 저장되지 않는다는 것이다!!

설정 파일의 style은 같아서 logback-spring.xml을 참고해서 파일로 저장하는 부분을 만들어 주었는데 해결이 안됬다.

한참 검색하고 이것저것 시도해보다가 공식문서를 발견했다.

그리고 거기있는건 되겠지 싶어서 다 지우고 공식문서 꺼만 남기니 파일로 저장이 잘 되는 것을 확인했다.

 

이 부분이 문제였는데, 우선 Listener를 추가해주었고, encoder에 있는 class를 삭제해주었다.

pattern은 full로 남기는 것도 있는데 그거는 너무 많은 정보를 남기는 것 같고 보기도 어려워서 한 줄로 깔끔하게 남는 패턴으로 설정했다.

<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />

<appender name="CONSOLE-ACCESS" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%t{yyyy-MM-dd HH:mm:ss}\t%a\t%r\t%s\t%i{Referer}\t%i{User-Agent}\t%D\t%I</pattern>
    </encoder>
</appender>
<appender-ref ref="CONSOLE-ACCESS"/>

 

spring에는 다른 로그 관련 라이브러리도 있는 것 같고 설정하는 것에 따라 다양하게 쓸 수 있는 것 같다!

 

멘토링 때 현업에서는 로그를 별도로 관리하기 때문에 이렇게 파일로는 남기는 경우가 별로 없다고 하던데, 작은 프로젝트에서는 남겨놓으면 에러 찾을 때 참고할 수 있어서 좋을 것 같다.