-
Notifications
You must be signed in to change notification settings - Fork 0
logback VS log4j2
logback
- spring-boot-starter-web의 기본 로깅 프레임워크
log4j2
- logback, log4j의 단점을 개선한 로깅 프레임워크
- logback보다 탁월한 성능 및 다양한 appender 제공
logback으로도 충분히 파일 로깅을 할 수 있기에 logback을 사용하기로 한다.
configurations {
// logback 의존성 제거
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
dependencies {
// log4j2
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
}
spring-boot-starter-web에서 기본으로 제공하는 logback 로깅 프레임워크 의존성을 제거하지 않으면 에러가 발생한다.
# application.yml
logging:
config: classpath:log4j2.yml
기본 default 값은 다음과 같다. 만약 로컬 환경과 배포환경이 나누어져있다면 logging의 config를 그에 맞게 수정해줘야 한다.
# application-local.yml
logging:
config: classpath:log4j2-local.yml
# application-prod.yml
logging:
config: classpath:log4j2-prod.yml
로깅 전략에 따라서 log4j2 yml 파일의 내용이 달라진다.
Console 방식, file(단일 파일, 재실행 시 사라짐), rollingfile(아카이브화 하여 보관)
우리는 로컬에서는 file, rollingfile로 남길 필요가 없다고 판단하여 Appender를 Console로 설정했다.
배포 환경에서는 로그 파일을 보관하는 것이 좋다고 판단해 RollingFile_Appender로 설정했다.
로컬 환경에서는 DEBUG, 배포 환경에서는 INFO로 로그 레벨을 설정했다.
그러나, 로컬과 개발에서 Spring Application을 구동 시 스프링 관련 불필요한 정보들이 너무 많이 출력돼 Root log level은 INFO로, Controller 패키지 이하에서는 DEBUG로 설정하는 방식으로 변경했다.
# log4j2-local.yaml
Configutation:
name: Default
status: info
Properties:
Property:
name: log-path
value: "logs"
Appenders:
Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
Loggers:
Root:
level: info
AppenderRef:
- ref: Console_Appender
Logger:
- name: com.gabia.bshop
additivity: false
level: debug
AppenderRef:
- ref: Console_Appender
Configutation:
name: Default
status: info
Properties:
Property:
name: log-path
value: "logs"
Appenders:
RollingFile:
- name: RollingFile_Appender
fileName: ${log-path}/rollingfile.log
filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}-%i.gz"
PatternLayout:
pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
Policies:
TimeBasedTriggeringPolicy:
Interval: 1
modulate: true
SizeBasedTriggeringPolicy:
size: "10 MB"
DefaultRollOverStrategy:
max: 10
Delete:
basePath: "${log-path}/archive"
maxDepth: "1"
IfLastModified:
age: "P14D"
IfAccumulatedFileCount:
exceeds: 140
Loggers:
Root:
level: info
AppenderRef:
- ref: RollingFile_Appender
Logger:
- name: com.gabia.bshop
additivity: false
level: info
AppenderRef:
- ref: RollingFile_Appender
Configuration
Configutation:
name: Default
status: info
로그 설정의 최상위 요소이다. 해당 파일의 루트 로깅 전략의 name과 status를 적어주면 된다.
status는 log level을 적어주면 된다. error, warn, info, debug, trace 중에서 선택하면 된다.
로그 레벨은 아래 순서를 따른다.
보통은 개발 환경에서는 debug 또는 info, 배포 환경에서는 info를 많이 하는 것으로 보인다.
무조건 많은 정보를 띄운다고 좋은 것이 아니다. 그만큼 용량을 많이 차지하고 불필요한 로그가 기록돼 가독성이 떨어지게 되기 때문이다.
Properties
Properties:
Property:
name: log-path
value: "logs"
Appenders
Appenders:
Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
로깅 전략을 명시해주는 부분이다.
- target: 표준 입출력임을 명시
- pattern: 로그 스타일 지정하여 가독성을 높일 수 있음 ( ERROR는 빨간색, INFO는 초록색 등으로)
RollingFile_Appender로 할 경우 파일을 저장할 기간, 용량 관리 등을 설정해주어야 하므로 꽤 복잡해진다.
Appenders:
RollingFile:
- name: RollingFile_Appender
fileName: ${log-path}/rollingfile.log
filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}-%i.gz"
PatternLayout:
pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{cyan} %highlight{[%-5p]}{FATAL=bg_red,
ERROR=red, INFO=green, DEBUG=blue, TRACE=bg_yellow} [%C] %style{[%t]}{yellow}- %m%n"
Policies:
TimeBasedTriggeringPolicy:
Interval: 1
modulate: true
SizeBasedTriggeringPolicy:
size: "10 MB"
DefaultRollOverStrategy:
max: 10
Delete:
basePath: "${log-path}/archive"
maxDepth: "1"
IfLastModified:
age: "P14D"
IfAccumulatedFileCount:
exceeds: 140
-
File
- name : RollingFileAppender 이름
- fileName : 저장할 파일 경로, 이름에 날짜 형식을 지정하여 저장 가능 (Properties에 지정한 logs 디렉토리의 archive 디렉토리 아래에 rollingfile.log_%d{yyyy-MM-dd}.gz 파일명으로 로그 저장)
- PatternLayout : 로그 출력 양식 지정
-
Policy : File RollingUp의 기준을 지정
- OnStartupTriggeringPolicy : jvm start시 trigger
- TimeBasedTriggeringPolicy + Interval : time에 따른 trigger(파일 이름 패턴의 최소단위 날짜로 계산, 위 예시는 하루에 한 번 RollingUp). 위 예시는 하루 단위로 압축 보관하도록 함.
- SizeBasedTriggeringPolicy + size : file size에 따른 trigger.
- CronTriggeringPolicy : Cron Expression(시간에 관한 표현)에 따른 trigger
-
DefaultRollOverStrategy : Rolling File을 Over(삭제)하는 기준을 지정
- max: 동시간대에 최대 10개까지 RollingFiles가 생성될 수 있도록 지정
- basePath: 아카이브화할 로그 파일 위치 지정. (Properties에 지정한 logs 디렉토리의 archive 디렉토리 아래에 rollingfile.log_%d{yyyy-MM-dd}.gz 파일명으로 로그 저장)
- IfLastModified - age: "P14D": 수정된지 14일이 지난 파일은 삭제
- IfAccumulatedFileCount : RollingUp된 압축파일을 저장하는 디렉토리에 존재할 수 있는 파일 개수. 파일 개수를 넘으면 오래된 파일부터 삭제(총 140개 초과시 오래된 파일부터 삭제)
제사한 내용은 공식 문서를 참고하자.
https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender
Loggers
Loggers:
Root:
level: info
AppenderRef:
- ref: Console_Appender
Logger:
- name: com.gabia.bshop
additivity: false
level: debug
AppenderRef:
- ref: Console_Appender
로깅을 직접하는 요소, 로거는 패키지 별도로 설정이 가능하다. Root 패키지의 로거는 필수적으로 세팅해주어야 하며, 추가적인 로거를 설정하려면 Logger로 설정해주어야 한다.
- level : 해당 패키지에 찍을 최하 로그 레벨을 지정
- additivity : false로 지정시 로그가 중복으로 찍히는 것을 방지 (기본값: true)
- AppenderRef : ref속성으로 적용할 Appender를 지정
🏷️ 설계 문서
📚 팀 컨벤션
- Issue 작성 가이드
- Merge Request 작성 가이드
- Git 브랜치 전략
- Commit 컨벤션
- 백엔드 코드 컨벤션
- 객체 및 메서드생성 규칙
- Ground Rule
- Request Response 규칙
🔧 Setting
✍ 스프린트 기록