본문 바로가기
Java

[Spring Boot] Logging 설정하기 (로그 설정)

by parkjp 2023. 7. 21.

 

Spring Boot Log 설정 준비(Logback)

Spring Boot Logging 설정을 해보자.

로그 설정 전에 일단 어떤 로그를 찍을지 고민을 해봐야한다.

 

  • API 요청(Request, Response)의 로그를 찍을 것인가.
  • 내가 필요로하는 데이터의 로그를 찍을 것인가.

 

API 요청에 대한 로그는 말 그대로 외부에서 들어온 요청이 어떤 데이터가 있었고 나갈때는 어떤 데이터를 주었는지, 에러가 있었는지에 대한 로그다.

 

내가 필요로하는 데이터의 로그는 API 요청에 대한 로그와는 상관없이 로직 내의 어느 부분에 로그를 찍고 싶다던가, 어떤 데이터를 수집을 하여 통계용으로 쓴다던가할 때 쓸 수 있을 것이다.

 

 

Dependency 설정

많이들 쓰는 logback과 @slf4j로 로그를 찍어보자.

그리고  나중에 분석하기 쉽게 json형식으로 찍도록 해보겠다.

implementation group: 'ch.qos.logback', name: 'logback-core', version: 'x.x.x'
implementation group: 'ch.qos.logback.contrib', name: 'logback-json-classic', version: 'x.x.x'
implementation group: 'ch.qos.logback.contrib', name: 'logback-jackson', version: 'x.x.x'

compileOnly group: 'org.projectlombok', name: 'lombok', version: 'x.x.x'
annotationProcessor 'org.projectlombok:lombok:x.x.x'

우선 logback-core와 lombok dependency를 추가해준다. 버전은 각자 맞춰 주자.

 

 

Logback-spring.xml 설정

그리고 프로젝트 resource 폴더 아래에 logback-spring.xml 파일을 추가해주자.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
                <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
                <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
                <appendLineSeparator>true</appendLineSeparator>
                <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                    <prettyPrint>false</prettyPrint>
                </jsonFormatter>
                <appendLineSeparator>true</appendLineSeparator>
            </layout>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="stdout"/>
    </root>
</configuration>

 

- statusListener-NopStatusListener 설정은 spring을 구동 시킬때 logback 상태에 관한 로그들이 너무 많이 나와서 안 나오도록 설정한 것이다.

 

- appender부분은 보통 ConsoleAppender와 RollingFileAppender를 자주 쓸 것이다.
ConsoleAppender는 콘솔(System.out과 System.err)에 로그가 추가되도록한다. 

RollingFileAppender는 지정한 파일에 로그를 쓰는데 롤오버 기능이 있다. (예시. 날짜 기준으로 로그를 쌓는다)

 

- jsonFormatter부분을 추가하여 로그가 json형식으로 나오도록 한다.

 

 

 

 

 

간단한 예시와 로그 레벨

아주 기본적인 logback 설정을 해보았다.

다음은 @Slf4j를 써서 로그를 찍어보자.

 

@Slf4j
public class LogTest {

    public void doSomething() {
    	log.debug("debug message");
    	log.info("info message");
        log.warn("warn message");
        log.error("error message");
    }
}

 

위 예시를 실행시켜 본다면 debug는 찍히지 않고 info부터 찍힐 것이다.

아까 logback 설정에서 root level을 info로 해놓았기 때문이다.

로그 레벨은 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 순이다.

 

 

 

여기까지 간단하게 로그찍는 법을 해보았다.

그럼 API 요청에 따른 로그는 어떻게 찍을까?

방법은 많겠지만 이제부터 어떻게 응용할지 개인마다 다른데 필자는 aspectj를 이용해서 해보았다.

그리고 한 로그 row에 request와 response를 한번에 담아처리하게끔 하였다.

데이터 수집을 위한 로그도 좀 더 맞춤 형식으로 찍도록 해보았다.

 

어느 정도 한번 라이브러리 형식으로 직접 만들어서 maven repository에 올려도 보았다.

현재 최신 버전은 자바 17, spring boot 3.0 버전이상이면 된다.

이걸 하면서 maven repository에 올리는 법도 터득하게 되었다.

 

 

Spring boot 로그 라이브러리

 

GitHub - parsingk/spring-boot-logger

Contribute to parsingk/spring-boot-logger development by creating an account on GitHub.

github.com

 

이걸 쓴다면 logback-spring.xml에 layout을 'com.spring.boot.logger.LoggerLayout'으로 바꿔야한다.

github에 써놓았다.

 

예시로 어떻게 찍히는지 봐보자.

 

API 요청에 대한 로그 예시이다.

{"timestamp":"2023-07-21T00:00:00.000Z","level":"INFO","service":"your-app","logtype":0,"url":"/","response":{"id":"11"},"message":"POST / 200 276 PostmanRuntime/7.32.3","headers":{"content-length":"0"},"method":"POST","request":{"password":"*******","name":null,"id":"server"},"requestId":"de47c134-75d0-4c4e-bec9-c459ee619445","status":200,"errorMessage":null,"stacktrace":null,"executiontime":"276","thread":"http-nio-8080-exec-1","logger":"xxxxx","context":"default"}

임의로 직접 찍은 로그 예시인데 jsonpayload에 들어가 있다.

{"timestamp":"2023-07-21T00:00:00.000Z","level":"INFO","logtype":1,"service":"your-app","jsonpayload":{"idx":100929,"session":~~,"name":"로그인","status":1},"thread":"http-nio-8080-exec-1","logger":"xxxxx","context":"default"}

 

올려 놓은 spring-boot-logger는 aws kinesis stream에 대한 dependency를 가지고 있어 설정한다면 콘솔에 찍지 않고  aws kinesis stream으로 바로 보낼 수 있도록 만들어 두었다.

API 요청에 대한 에러 로그만 콘솔에 찍을 수도 있고 어느 정도 커스텀이 가능하게끔 해보았다.

필자는 현재 임의로 직접 찍은 로그만 aws kinesis stream으로 보내어 수집해보고 있다.

 

라이브러리 형식으로 만들어 보았는데 어느 정도 나에게만 맞춰져 있는 건가 싶기도 하다.

어떻게 하는게 더 나은 방향인지 고민 중이다.

지속적으로 업데이트를 할 예정이다.

반응형