Log4j2 설정
개요
로컬에서 작업할 경우 로그 메세지를 console로 출력하며 메세지들을 장기적으로 관리할필요가 없지만 라이브 환경에서는 다르다. 일반적으로는 별도의 파일로 저장시키며 특별한 경우는 외부 서비스나 별도의 저장소에 저장하기도 한다. 여기서는 톰캣을 이용해 서비스를 하는 웹앱 환경에서 로그 파일들을 일정 기간동안 유지하는 설정을 설명한다.
설정 상세
의존성
의존성 관리는 maven을 사용했다. log4j2를 직접 사용하기 보단 로그 파사드인 slf4j를 이용한다. 그리고 설정 파일은 YAML 포맷을 사용한다.
<properties> <jackson.version>2.9.0</jackson.version> <dataformat.yaml.version>2.9.0</dataformat.yaml.version> <slf4j.version>1.7.25</slf4j.version> <log4j.version>2.9.0</log4j.version> </properties> <!-- YAML DataBinding --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-yaml</artifactId> <version>${dataformat.yaml.version}</version> </dependency> <!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>${log4j.version}</version> </dependency>
log4j2.yaml 구조
log4j2.yaml의 기본적인 구조다. 아래 내용을 골격으로 해서 상세 설정을 붙여나간다.
Configuration: Properties: Appenders: Loggers:
RollingFileAppender를 이용해 30일간 로그 파일 유지하기
아래 설정을 통해 얻는 효과는 다음과 같다.
- 이 설정파일은 300초마다 탐색되며 변경사항이 있을 경우 재시작 없이 변경사항을 적용한다.
- info 레벨 이상의 로그는
${CATALINA_BASE}/log
하위 경로에 저장된다. - 로그 파일은 하루마다 rollover되며 이전 로그 파일은
${CATALINA_BASE}/log/archive
저장되며 파일 개수가 31개가 넘을 경우 가장 오래된 파일을 삭제한다.
Configutation: name: Log4j2 configuration for My App status: warn monitorInterval: 300 Appenders: Console: name: ConsoleAppender target: SYSTEM_OUT PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%level] %C{1.} - %msg%n" RollingFile: name: RollingFileAppender fileName: "${sys:catalina.base}/logs/app.log" filePattern: "${sys:catalina.base}/logs/archive/app.log-%d{yyyy-MM-dd}" append: true PatternLayout: pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%level] %C{1.} - %msg%n" Policies: TimeBasedTriggeringPolicy: interval: 1 modulate: true DefaultRolloverStrategy: Delete: basePath: "${sys:catalina.base}/logs/archive" maxDepth: "1" IfAccumulatedFileCount: exceeds: 31 Loggers: Root: level: info appenderRef: ref: RollingFileAppender
Configuration 속성
속성 | 설명 |
---|---|
dest | Log4j2 내부에서 발생하는 로그 출력 경로. ‘err’일 경우 stderr로 출력하며, 파일 경로나 URL 설정이 가능하다. |
name | 설정의 이름 |
status | Log4j2 내부에서 발생하는 로그 이벤트에 대한 logging level 설정. Log4j2는 초기화와 같은 내부 동작에 대한 내용을 상태 로그로 출력하는데 상태 로그에 대한 로그 레벨을 설정해줄 수 있다. 가능한 값은 “trace”, “debug”, “info”, “warn”, “error”, “fatal”이다. |
minitorInterval | 설정이 변경 됐는지 체크하는 주기(seconds). 변경이 감지되면 재설정 한다. |
shutdownHook | JVM이 중단되면 log4j도 같이 중단할지 여부. 디폴트는 “enable”이며 원하지 않을경우 “disable” 가능하다. |
shutdownTimeout | JVM이 중단됐을 때 appender와 백그라운드 태스크가 종료되기까지 기다리는 시간(milliseconds). 디폴트 값은 “0”으로 각 apeender의 timeout을 따라가며, 백그라운드 태스크는 바로 종료시킨다. 단 모든 appender가 이 값을 따르진 않다. shutdownHook이 활성화 됐을때만 유효하다. |
verbose | 플러그인들을 불러오는 동안 상세 로그 출력 여부 |
RollingFileAppender
RollingFileAppender는 TriggerPolicy와 RolloverStrategy를 기반으로 rollover되는 파일에 로그를 기록한다.. TriggerPolicy는 언제 rollover가 발생할지 결정하며, RolloverStrategy는 어떻게 rollover 될지 결정한다. https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender
속성 | 타입 | Default | 설명 |
---|---|---|---|
name | String | Appender 이름 | |
append | boolean | true | true일 경우 로그 출력이 기존 파일에 추가된다. false일 경우 기존 파일의 내용이 모두 삭제되고 출력이 쌓인다. |
fileName | String | 로그를 저장할 파일명. 만약 상위 디렉토리나 파일이 없을 경우 생성한다. 설정에 명시돼 있는 "${sys:catalina.base}” 값은 톰캣이 실행될때 설정하는 CATALINA_BASE 위치를 읽어오기 위해 사용했다. |
|
filePattern | String | 저장될 파일의 이름 패턴을 설정. | |
layout | Layout | 로그 이벤트 출력에 사용되는 포맷. layout이 설정되지 않으면 “%m%n” 이 패턴 레이아웃으로 설정된다. |
|
strategy | RolloeverStrategy | RolloverStrategy를 설정 | |
Policies | TriggerPolicy | TriggerPolicy들을 설정. 복수개의 TriggerPolicy 설정이 가능하다. | |
filePermission, fileGroup |
파일 권한 설정 옵션들. |
DefaultRolloverstrategy의 max 옵션
DefaultRolloverStrategy
옵션 중 max
속성이 있는데, 처음에는 단순히 유지할 최대 파일 개수를 설정하는 값인줄 알았다. 하지만 이 속성은 카운터의 최대값
으로 설명돼 있고 자세히는 파일이 rollover 될 때 filePattern
속성을 “%i”
로 숫자 카운터를 설정할 수 있는데, strategy
조건을 충족할 때 파일이 교체되면서 저 값이 증가한다. 이 때 저 카운터가 증가하면서 생성되는 파일들을 유지시킬 파일 개수를 설정하는 값이다. 단순히 날짜 패턴만 사용할때는 max
속성으로 의도한 설정을 유도할 수 없었다.
Log4j2에서는 좀더 자유로운 파일 관리를 위해 Delete액션을 추가했다.
Delete
속성 |
설명 |
---|---|
basePath | Delete 설정을 적용할 폴더명 |
maxDepth | Delete 액션을 특정 경로 이하의 폴더들을 순회하면서 적용시킬 수 있다. 위에 basePath 하위 폴더 몇번째 depth까지 적용할지 설정 |
IfAccumulatedFileCount.exceeds | Delete 액션을 적용할 전략. 각 경로의 파일 개수가 일정 수를 초과하면 초과한 파일들을 지운다. |
Delete 액션 사용시 주의사항
RollingFileAppender
의 Delate 액션 옵션중 IfAccumulatedFileCount.exceeds
는 해당 경로에 있는 모든 파일이 설정값보다 클 경우 날짜 기준으로 무조건 삭제한다. 하지만 로그 파일 뿐만 아니라 관계 없는 파일도 무작위로 선택해서 삭제하기 때문에 해당 설정을 사용하기 위해서는 저장되는 로그 파일들을 별도 경로로 모아줘야한다. 때문에 파일 저장소를 log폴더 하위 별도 archive 폴더로 설정했다.
TimeBasedTriggeringPolicy
TimebasedTriggeringPolicy 관련 설명은 정확하지 않거나 정확히 이해하지 못한 부분이 있습니다.
TimebasedTriggeringPolicy은 로그 이벤트의 date/time이 현재 쓰고있는 파일의 날짜 패턴과 맞지 않을때 rollover시킨다.
속성 | 설명 |
---|---|
Interval | 날짜 패턴에서 명시된 가장 작은 시간/날짜 단위 기준으로 얼마나 자주 rollover가 발생할지 설정.만약 시간(hour)을 가장 작은 단위로 가지는 날짜 패턴에서 이 설정값으로 4가 주어지면 매 4시간마다 rollover가 발생 |
modulate | 인터벌 바운더리를 조정. 예를들어 현재가 3시이고 interval 값이 4일 경우 첫 rolloever는 4시에 발생하고 이후에는 8시 12시, 16, 20시 0시 간격으로 발생한다. |
Test
Junit을 이용해 Log4j2 설정에 이상이 없는지 확인할 수 있다.
public class Log4J2YamlConfTest { @Test public void testPerformSomeTask() throws Exception { Log4J2YamlConf log4J2YamlConf = new Log4J2YamlConf(); log4J2YamlConf.performSomeTask(); } }
'Java > Log4j 2' 카테고리의 다른 글
Log4j2 - 개요 (0) | 2017.10.18 |
---|
댓글