만쥬의 개발일기
article thumbnail

 

최근 가장 많이 하는 생각이 어떻게 해야 로그와 예외 처리를 잘 할 수 있을까에 대한 고민이다.

자바에는 여러 로깅 라이브러리가 있는데, 그 중에서 오늘은 log4j2를 사용해 로깅 설정을 해보자.

 

log4j2는 다음 표에서 알 수 있듯이 Multi Thread 환경에서 비동기 로거의 경우 다른 로킹 프레임워크보다 많은 처리량과 짧은 대기 시간을 제공한다. 마침 멀티쓰레딩 프로그램에 사용할 예정이기에, 아주 적합하다고 볼 수 있다.

 

개발환경
Plain java
java17
wsl2 - ubuntu18.04

의존성 추가

먼저 최신 log4j2에 대한 의존성을 build.gradle에 추가해준다.

dependencies{
    .
    .
    implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
    implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
}

log4j2 설정 파일 추가

이후 java ➡️ resuorces 하위에 log4j2.properties 파일을 생성한다.

파일 내용은 다음과 같이 적는다.

name = PropertiesConfig
property.filename = ./logs/${date:yyyy-MM-dd_HH-mm-ss}-log.log

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{yyyy-MM-dd HH:mm:ss}] :: [%p] %c >> %m%n 
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = warn

appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = ${filename}.%d{yyyy-MM-dd}.log
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%p], %d{yyyy-MM-dd HH:mm:ss} %c{1}:%L - %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 3
appender.rolling.filter.threshold.type = ThresholdFilter
appender.rolling.filter.threshold.level = info

#for java code

logger.rolling.name = {프로젝트 이름}
logger.rolling.level = info
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile

rootLogger.level = info
rootLogger.appenderRefs = rolling, STDOUT
rootLogger.appenderRef.rolling.ref = RollingFile

## 콘솔 로그 ##
# rootLogger.appenderRef.stdout.ref = STDOUT

# Hibernate 패키지 로그 레벨 설정
logger.hibernate.name = org.hibernate
logger.hibernate.level = ERROR

코드 설명

  1. name = PropertiesConfig
    • Log4j2의 구성을 식별하기 위한 이름입니다.
  2. property.filename = ./logs/${date:yyyy-MM-dd_HH-mm-ss}-log.log
    • 로그 파일의 이름을 동적으로 생성합니다. ${date:yyyy-MM-dd_HH-mm-ss}는 현재 날짜 및 시간을 나타냅니다. logs폴더가 없다면 자동으로 생성합니다.
  3. appender.console 섹션
    • 콘솔 출력을 위한 appender 설정입니다.
    • 로그 레벨이 warn 이상인 로그만 출력됩니다.
  4. appender.rolling 섹션
    • RollingFile appender 설정으로 파일에 로그를 기록합니다.
    • 로그 파일은 시간별로 롤링되며, 최대 3개의 백업 파일이 유지됩니다.
    • 파일 이름과 파일 패턴은 ${filename}을 사용하여 동적으로 생성됩니다.
  5. logger.rolling 섹션
    • {프로젝트명}으로 Logger를 정의합니다.
    • 이 Logger는 파일로 로그를 기록하며, 레벨은 info입니다.
  6. rootLogger 섹션
    • root Logger의 설정을 정의합니다.
    • 파일로 로그를 기록하는 rolling appender와 콘솔 출력을 위한 STDOUT appender가 설정되어 있습니다.
    • 레벨은 info로 설정되어 있습니다.
  7. logger.hibernate 섹션
    • Hibernate 패키지의 로그 레벨을 설정합니다. 여기서는 ERROR로 설정되어 있어 Hibernate의 INFO 레벨 이하의 로그는 출력되지 않습니다.

 

7번 hibernate 섹션의 경우, hibernate의 자잘한 로그가 개발 시 방해되어 작성하였다.

 

작성 전 : 직접 작성한 log 외에도 쓰레드가 4개인 멀티쓰레딩 프로그램이어서, hibernate의 다양한 로그가 4번씩 찍히는 모습이다.

jpa persistence 연결, 커넥션 풀링 등등 다양한 정보가 있으니 처음부터 끄지는 말자.

 

작성 후 : 원하는 로그만 보기 쉽게 작성된 모습이다.

 

로그레벨

FATAL > ERROR > WARN > INFO > DEBUG > TRACE

TRACE : 상세한 정보

DEBUG : 상세한 일반 정보

INFO : 일반 정보

WARN : 주의 사항

ERROR : 일반 에러

FETAL : 치명적인 에러

 

옵션

  • %d : 로깅 이벤트가 일어난 날자(date)
  • %p : 로깅 이벤트의 priority
  • %t : 로깅 이벤트를 생성한 스레드 이름
  • %c : 로깅 이벤트의 category
  • %F : 로깅요청을 일으킨 파일 이름
  • %L : 로깅요청을 일으킨 파일의 행번호
  • %x : 로깅이벤트를 발생시킨 스레드에 관련된 내포검사항목 (Nested Diagnostic Context : NDC)을 출력
  • %C : 로깅요청을 일으킨 호출자의 완전한 클래스이름
  • %M : 로깅요청을 일으킨 메소드
  • %m : 메세지
  • %n : 플랫폼 독립적인 개행문자
  • %l : 소스코드의 위치정보를 출력한다. %C. %M(%F:%L) 의 축약형

 

reference

https://gimdam.tistory.com/entry/log4j-java-log4j2-적용하기-log4j2-properties-log4j-옵션-설정

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!