로그 파일 남기기

개발을 하면서 늘 로그도 편하게 확인할 수 있으면 좋겠다는 생각을 하였다.

하지만 어떻게 하는지 몰라서 그냥 IDE 터미널 로그만 보았었는데

최근 인프라 관련 편의성 설정들을 해보면서 로그도 어떻게 파일로 따로 저장할 수 있을거란 생각이 들었다.

이번 글에서는 스프링부트 애플리케이션의 로그를 저장하는 방법을 정리해두려 한다.


써보기

사실 로그는 거의 모든 애플리케이션에서 남기는거라 스프링에서 기본 로깅 라이브러리를 제공한다.

스프링부트에서 로깅을 할 때 쓰는 @Slf4j 는 다들 한번씩 써본 애노테이션일거라 생각한다.

우리가 그동안 쓰던 Slf4j는 인터페이스이고, 구현체로 Logback, Log4j 등이 있다.

이번 글에서 사용할 Logback 라이브러리는 스프링부트의 기본 로깅 라이브러리이므로 따로 의존성을 추가할 필요는 없다.

(Log4j는 따로 추가해야한다는것 같기는 하다.)

순서는 아래와 같다.

  1. logback-spring.xml 파일 작성
  2. 결과 확인

1. logback-spring.xml 파일 작성

logback 라이브러리로 로그 파일을 남기려면 아래 두 가지 방법 중 하나로 설정을 추가 해줘야한다.

  • yml 파일 설정
  • xml 파일 설정

xml 파일은 몬가 구닥다리 느낌이 나서 최대한 yml 파일로 해보고 싶었지만 세세한 설정은 xml 파일로 하는게 나은듯하다.

yml 파일로 설정하려면 yml 파일이 길어지는것 같고 길이도 비슷한것 같아서 xml 파일로 설정하였다.

logback에서 읽는 xml 설정 파일의 기본 값은 logback-spirng.xml 인데 따로 추가 설정을 해주면 파일명을 변경할 수 있다.

로그는 기본적으로 아래와 같은 형식으로 출력하고 저장한다.

[날짜] [쓰레드 이름] [로그 레벨] [로그 발생 지점] [로그 메시지]
ex) 2024-06-18 13:24:59 [http-nio-8080-exec-9] ERROR cohttp://m.example.dream.TestController - [error] hi2 error

logback-spring.xml

<configuration>
    <!-- 콘솔창(IDE 터미널 혹은 CLI 등)에 띄울 로그 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 모든 로그 저장용 파일 설정 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 로그 파일명 -->
        <file>logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 로그 파일을 일별로 롤오버 -->
            <fileNamePattern>logs/application.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 로그를 30일간 저장하고 그 이상은 덮어씌움 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- error 로그 저장용 파일 설정 -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- error 로그 파일명 -->
        <file>logs/error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 로그 파일을 일별로 롤오버 -->
            <fileNamePattern>logs/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 로그를 30일간 저장하고 그 이상은 덮어씌움 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 루트 로거 - info 레벨 이상의 로그 저장 -->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>
</configuration>

 

<rollPolicy/> 에서는 롤링 정책에 따라 롤 오버 시의 로그 파일 이름을 지정한다.

롤 오버 시 logs/error.2024-06-18.log 이런 식으로 저장한다.

본인은 모든 로그를 저장하는 파일과 에러 로그를 저장하는 파일을 따로 두고 싶었다.

그래서 모든 로그는 application.log에, 에러 로그는 error.log에 저장하도록 설정하였다.


2. 결과 확인

애플리케이션을 실행하면 아래 사진처럼 logs 폴더를 만들고 그 아래에 로그 파일을 생성한다.

2-1. 모든 로그

원하는대로 INFO 레벨 이상의 로그를 남긴다.

2-2. 에러 로그

원하는대로 ERROR 로그만 남긴다.


EC2 에서 jar 파일로 배포할때는?

로컬에서 IDE로 실행할 때는 프로젝트 루트 디렉토리에 logs 폴더를 만들고 그 아래에 저장되었다.

이렇게 설정해두면 EC2에서 jar 파일로 빌드하면 로그 파일이 어디에 생성될까?

 

궁금해서 실험해보았더니 아래처럼 jar 파일이 있는 디렉토리에 logs 폴더가 생성되어 있다.

기본적으로 jar 파일로 실행할때는 jar 파일이 있는 디렉토리가 루트 디렉토리라고 생각해도 될것 같다.

+ Recent posts