애플리케이션 logging을 위한 적절한 방법

2023. 5. 1. 01:05JAVA/Spring

1. 작업을 위해서 적절한 도구들을 사용하자

SLF4J를 활용하여 다음과 같이 구현할 수 있습니다.

log.debug("Found {} records matching filter: '{}'", records, filter);

 

2. 잊지말자, 로깅 레벨(logging levels)들은 너를 위한 것이다.

  • 1) ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시됩니다.
  • 2) WRAN : 처리 가능한 문제, 향후 시스템 에러의 원이 될 수 있는 경고성 메시지를 표시합니다.
  • 3) INFO : 상태 변경과 같은 정보성 로그를 표시합니다.
  • 4) DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다.
  • 5) TRACE : 추적 레벨은 DEBUG 레벨보다 훨씬 상세한 정보를 표시합니다.

3. 무엇을 로깅할 것인지 알자

logging할 때 무엇을 logging하는지 제대로 알고 logging합니다.

 

 

4. 사이드 임팩트(side effects)를 회피하자

  • logging으로 인하여 애플리케이션 기능의 동작에 영향을 미치지 않아야 합니다.
  • 예를 들어 logging하는 시점에 NullPointerException이 발생해 프로그램이 정상적으로 동작하지 앟는 상황이 발생하면 안됩니다.

5. 간결하게 설명해야 한다

각각의 로깅에는 데이터와 설명이 모두 포함되어야 합니다.

 

6. 패턴을 설정하자

  • logging 설정 파일에서 패턴 설정시 애플리케이션 상황에 따라 적절하게 조정해서 설정해야 합니다.
  • 로깅 패턴은 현재 시간, 로깅 레벨, 쓰레드 이름, 간단한 로거 이름과 메시지를 포함하면 좋습니다.
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n</pattern>
    </encoder>
</appender>
  • 파일 이름과 클래스 이름, 라인 번호는 안 넣는것이 좋습니다.

 

7. Log 메소드 매개변수와 반환 값

  • 메소드의 매개변수와 반환값을 로그로 남기면 디버거를 사용해 디버깅하지 않아도 됩니다. 특히 디버거를 사용할 수 없는 상황에서는 유용하게 사용할 수 있습니다.
  • AOP를 사용해 적용할 수 있습니다.

 

8. 외부 시스템을 조심하자

외부 시스템, API와 연동하는 경우 이에 대한 매개변수와 반환 값을 로깅을 남길 필요가 있습니다.

 

9. 예외를 올바르게 로깅하자

SLF4J를 사용하는 경우 error log의 stack trace를 보고 싶다면 다음과 같이 error log를 남겨야 합니다.

log.error("Error reading configuration file", e);

 

10. 읽기 쉬운 로그는 분석하기도 쉽습니다.

 

References

 10 Tips for Proper Application Logging