최근 가장 많이 하는 생각이 어떻게 해야 로그와 예외 처리를 잘 할 수 있을까에 대한 고민이다.
자바에는 여러 로깅 라이브러리가 있는데, 그 중에서 오늘은 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
코드 설명
name = PropertiesConfig
- Log4j2의 구성을 식별하기 위한 이름입니다.
property.filename = ./logs/${date:yyyy-MM-dd_HH-mm-ss}-log.log
- 로그 파일의 이름을 동적으로 생성합니다.
${date:yyyy-MM-dd_HH-mm-ss}
는 현재 날짜 및 시간을 나타냅니다. logs폴더가 없다면 자동으로 생성합니다.
- 로그 파일의 이름을 동적으로 생성합니다.
appender.console
섹션- 콘솔 출력을 위한 appender 설정입니다.
- 로그 레벨이
warn
이상인 로그만 출력됩니다.
appender.rolling
섹션- RollingFile appender 설정으로 파일에 로그를 기록합니다.
- 로그 파일은 시간별로 롤링되며, 최대 3개의 백업 파일이 유지됩니다.
- 파일 이름과 파일 패턴은
${filename}
을 사용하여 동적으로 생성됩니다.
logger.rolling
섹션- {프로젝트명}으로 Logger를 정의합니다.
- 이 Logger는 파일로 로그를 기록하며, 레벨은
info
입니다.
rootLogger
섹션- root Logger의 설정을 정의합니다.
- 파일로 로그를 기록하는
rolling
appender와 콘솔 출력을 위한STDOUT
appender가 설정되어 있습니다. - 레벨은
info
로 설정되어 있습니다.
logger.hibernate
섹션- Hibernate 패키지의 로그 레벨을 설정합니다. 여기서는
ERROR
로 설정되어 있어 Hibernate의INFO
레벨 이하의 로그는 출력되지 않습니다.
- Hibernate 패키지의 로그 레벨을 설정합니다. 여기서는
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-옵션-설정
'♾️Language & Framework > ☕Java' 카테고리의 다른 글
[Java / Trouble Shooting] - Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/Gson 에러 발생 시 해결 방법 (0) | 2024.01.01 |
---|---|
[Java] - Timestamp 자료형에서 에러가 발생했을 때 (1) | 2024.01.01 |
[Java] - Java 프로젝트 초기 설정 + 자바 버전 변경 (0) | 2024.01.01 |
[Java 기술 면접 대비] - 5. extends VS implements (0) | 2023.11.09 |
[Java] - Lombok이란? (0) | 2023.11.09 |