스프링부트에 log4j2.yml
과 build.gradle
을 이용하여 log4j2
를 설정
기본적으로 slf4j
로깅 프레임워크를 사용하고, spring-boot-starter-web
은 logback
이 기본 로깅 모듈이므로 logback
의 의존성을 제거하고 log4j2
의존성을 추가해야한다. (logback
미제거시 multiple binding error)
configurations { /*logback 의존성 제거*/
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
dependencies { /*log4j2 의존성 추가*/
compile 'org.springframework.boot:spring-boot-starter-log4j2'
compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.10.3'
}
applcation.yml
에 하나씩 설정하는 방법도 있지만 그렇게하면 내용이 너무 길어지고 커스텀하기 힘들다는 단점이 있어 log4j2.yml
파일을 생성하고 applcation.yml
에는 해당 파일을 참조하도록 설계
logging:
config: classpath:log4j2.xml
logging:
config: file:./config/log4j2.yml
아래는 log4j2.yml
에 작성한 코드 내용이다.
Configutation:
name: Default
status: warn
Properties:
Property:
name: log-path
value: "logs"
Appenders:
Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
File:
name: File_Appender
fileName: ${log-path}/logfile.log
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
RollingFile:
- name: RollingFile_Appender
fileName: ${log-path}/rollingfile.log
filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
Policies:
TimeBasedTriggeringPolicy:
Interval: 1
modulate: true
DefaultRollOverStrategy:
Delete:
basePath: "${log-path}/archive"
maxDepth: "1"
IfAccumulatedFileCount:
exceeds: 31
Loggers:
Root:
level: info
AppenderRef:
- ref: Console_Appender
- ref: File_Appender
- ref: RollingFile_Appender
Logger:
- name: 적용할 패키지
additivity: false
level: info
AppenderRef:
- ref: Console_Appender
- ref: File_Appender
- ref: RollingFile_Appender
Configutation:
name: Default
status: warn
Properties
, Appenders
, Loggers
요소를 자식으로 가진다.status
는 내부 이벤트에 대한 로그 레벨을 의미 Properties:
Property:
name: log-path
value: "logs"
Configuration
에서 사용할 Properties
를 설정하는 것으로 name
속성이 key, value
속성이 value 값으로 생각(간단하게 변수로 이해하기) Appenders:
Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
File:
name: File_Appender
fileName: ${log-path}/logfile.log
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
RollingFile:
- name: RollingFile_Appender
fileName: ${log-path}/rollingfile.log
filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
Policies:
TimeBasedTriggeringPolicy:
Interval: 1
modulate: true
DefaultRollOverStrategy:
Delete:
basePath: "${log-path}/archive"
maxDepth: "1"
IfAccumulatedFileCount:
exceeds: 31
Appender
는 로그 메시지를 특정 위치에 전달하는 역할을 한다.ConsoleAppender
,FileAppender
,RollingFileAppender
등을 가진다. Console:
name: Console_Appender
target: SYSTEM_OUT
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
name
: ConsoleAppender
이름target
: 출력 방식 기본값은 SYSTEM_OUT, SYSTEM_ERR로 출력가능PatternLayout
: pattern
에 로그 출력 양식 지정 File:
name: File_Appender
fileName: ${log-path}/logfile.log
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
name
: FileAppender
이름fileName
: 저장할 파일 경로, 이름 지정(Properties
에 지정한 logs
디렉터리에 logfile.log
파일명으로 로그 저장)PatternLayout
: pattern
에 로그 출력 양식 지정로그 내용을 한 파일에 계속 저장한다면 파일이 너무 커지고 문제가 생기면 로그를 모두 날려버릴 수 있으므로 RollingFileAppender
는 특정 기준으로 압축하여 저장하는 방식의 Appender
이다.
File
, Policy
, Straegy
관련된 속성이 있다.
RollingFile:
- name: RollingFile_Appender
fileName: ${log-path}/rollingfile.log
filePattern: "${log-path}/archive/rollingfile.log_%d{yyyy-MM-dd}.gz"
PatternLayout:
pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t][%F] %c{1} - %msg%n"
Policies:
TimeBasedTriggeringPolicy:
Interval: 1
modulate: true
DefaultRollOverStrategy:
Delete:
basePath: "${log-path}/archive"
maxDepth: "1"
IfAccumulatedFileCount:
exceeds: 31
File
name
: RollingFileAppender
이름fileName
: 저장할 파일 경로, 이름에 날짜 형식을 지정하여 저장 가능 (Properties
에 지정한 logs
디렉터리 아래 archive
디렉터리 아래 rollingfile.log_%d{yyyy-MM-dd}.gz
파일명으로 로그 저장)PatternLayout
: pattern
에 로그 출력 양식 지정Policy
: File RollingUp의 기준을 지정OnStartupTriggeringPolicy
: jvm start시 triggerTimeBasedTriggeringPolicy
+ Interval
: time에 따른 triggerSizeBasedTriggeringPolicy
+ size
: file size에 따른 trigger CronTriggeringPolicy
: Cron Expression(시간에 관한 표현)에 따른 triggerDefaultRollOverStrategy
rollingfile.log_%d{yyyy-MM-dd}%i.gz
일 때rollingfile.log_2021-03-03_1.gz
, rollingfile.log_2021-03-03_2.gz
...IfAccumulatedFileCount
: RollingUp된 압축파일을 저장하는 디렉터리에 존재할 수 있는 파일 개수. 파일 개수를 넘으면 오래된 파일부터 삭제(30개 초과시 오래된 파일부터 삭제, 30일치 로그 보관)로깅을 직접 하는 요소입니다. 로거는 패키지 별로 설정 가능
Root
패키지의 로거는 필수적이고, 추가적인 로거는 Logger
로 설정
Loggers:
Root:
level: info
AppenderRef:
- ref: Console_Appender
- ref: File_Appender
- ref: RollingFile_Appender
Logger:
- name: 적용할 패키지
additivity: false
level: info
AppenderRef:
- ref: Console_Appender
- ref: File_Appender
- ref: RollingFile_Appender
level
: 해당 패키지에 찍을 최하 로그 레벨 지정 AppenderRef
: ref
속성으로 적용할 Appender
지정additivity
: false로 지정시 로그가 중복으로 찍히는 것을 방지 (기본값 true)