도찐개찐
[Spring Boot] gradle 환경 log4j2 설정 본문
스프링부트에 log4j2.yml과 build.gradle을 이용하여 log4j2를 설정
1. build.gradle
기본적으로 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'
}
2. application.yml
applcation.yml에 하나씩 설정하는 방법도 있지만 그렇게하면 내용이 너무 길어지고 커스텀하기 힘들다는 단점이 있어 log4j2.yml 파일을 생성하고 applcation.yml에는 해당 파일을 참조하도록 설계
application.yml과 log4j2.yml이 src내부 resources디렉터리 하위에 위치할 때logging:
config: classpath:log4j2.xml
application.yml과 log4j2.yml이 src외부 프로젝트 바로 아래 config 디렉터리에 위치할 때
logging:
config: file:./config/log4j2.yml
3. 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
3-1. Configuration
Configutation:
name: Default
status: warn
- 로그 설정의 최상위 요소로 Properties, Appenders, Loggers요소를 자식으로 가진다.
- status 는 내부 이벤트에 대한 로그 레벨을 의미
3-2. Properties
Properties:
Property:
name: log-path
value: "logs"
- Configuration에서 사용할 Properties를 설정하는 것으로 name 속성이 key, value 속성이 value 값으로 생각(간단하게 변수로 이해하기)
3-3. Appenders
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 등을 가진다.
- 출력 결과를 나타내기 위해 Format문자를 사용.
- %c, %logger : 해당되는 로거의 이름을 출력
- %C, %class : 클래스명을 출력
- %d, %date : 해당 로그가 발생한 시간
- 포맷은 %d{HH:mm:ss}, %d{yyyy-MM-dd HH:mm:ss}같은 형태로 사용
- %enc, %encode : 특정 언어에서의 출력을 위한 문자 인코딩
- %ex, %exception, %throwable : 예외 로그. 길이를 설정할 수 있음.
- %F, %file : 해당 로그가 발생한 클래스 파일명
- %l, %location : 해당 로그가 발생한 클래스명.메소드명(파일:라인)
- %L, %line : 해당 로그가 발생한 라인 번호
- %m, %msg, %message : 로그문에 전달된 메시지
- %n : 줄바꿈
- %p, %level : 로그 레벨
- FATAL : 아주 심각한 에러가 발생한 상태
- ERROR : 요청을 처리하는 중 문제가 발생한 상태
- WARN : 처리 가능한 문제이지만, 향후 에러의 원인이 될 수 있는 상태
- INFO : 로그인, 상태변경과 같은 정보성 메세지
- DEBUG : 개발시 디버그 용도로 사용
- TRACE : 디버그 레벨이 너무 광범한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄
- %r, %relative : 로그 처리시간
- %t, %thread : 해당 로그가 발생한 스레드명
- %style{pattern}{ANSI style} : ANSI를 사용해 특정 패턴을 스타일링함
- %highlight{pattern}{style} : 로그 레벨명을 ANSI 색깔로 하이라이트
3-3-1. Appender - Console
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에 로그 출력 양식 지정
3-3-2. Appender - File
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에 로그 출력 양식 지정
3-3-3. Appender - RollingFile
로그 내용을 한 파일에 계속 저장한다면 파일이 너무 커지고 문제가 생기면 로그를 모두 날려버릴 수 있으므로 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시 trigger
- TimeBasedTriggeringPolicy + Interval : time에 따른 trigger
(파일 이름 패턴의 최소단위 날짜로 계산, 위 예시는 하루에 한 번 RollingUp) - SizeBasedTriggeringPolicy + size : file size에 따른 trigger
- CronTriggeringPolicy : Cron Expression(시간에 관한 표현)에 따른 trigger
- DefaultRollOverStrategy
- atetime 패턴과 파일패턴의 int값을 받아서 결정된다. datetime은 현재 시간으로 대체되고, 파일 패턴 숫자는 db의 autoincrement처럼 rollover 마다 1씩 증가
- %i가 파일패턴의 int rollingfile.log_%d{yyyy-MM-dd}%i.gz일 때
ex) rollingfile.log_2021-03-03_1.gz, rollingfile.log_2021-03-03_2.gz... - IfAccumulatedFileCount : RollingUp된 압축파일을 저장하는 디렉터리에 존재할 수 있는 파일 개수. 파일 개수를 넘으면 오래된 파일부터 삭제(30개 초과시 오래된 파일부터 삭제, 30일치 로그 보관)
3-4. Loggers
로깅을 직접 하는 요소입니다. 로거는 패키지 별로 설정 가능
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)
참고사이트
728x90
'JAVA > SpringBoot' 카테고리의 다른 글
[SpringBoot] Swagger API 문서 자동화 (0) | 2023.02.21 |
---|---|
[SpringBoot] intelij resource 실시간 반영 (0) | 2022.10.29 |
[SpringBoot] Swagger (0) | 2022.05.09 |
[Spring Boot] CORS 설정하기 (0) | 2022.05.07 |
Spring Security + JWT 회원가입, 로그인 구현 (0) | 2022.05.06 |
Comments