log4j2에서 xml설정 간 제일 중요한것은 xml 설정이라 생각된다.
그래서 실제 사용하는 xml을 기반(살짝 편집한)으로 하나하나 뜯어보도록 하자.
Level
전제조건으로 로그의 level이 무엇을 뜻하는지 알아야 나머지 설정을 원할하게 할수 있으므로 알아보도록 하자
https://en.wikipedia.org/wiki/Log4j
- OFF
가능한 가장 높은 순위이며 로깅을 해제 - FATAL
조기 종료를 유발하는 심각한 오류. 콘솔에 즉시 표시 될 것으로 예상 - ERROR
런타임 오류 또는 예기치 않은 조건. 콘솔에 즉시 표시 - ̶W̶A̶R̶N̶
더 이상 사용되지 않는 API 사용, ‘거의’오류에 가까운 상황.
상태 콘솔에 즉시 표시 - INFO
런타임 이벤트. 콘솔에 즉시 보일 것으로 예상되므로 보수적이며 최소한으로 유지 - DEBUG
시스템을 통한 흐름에 대한 자세한 정보.
로그에만 쓰여질 것으로 예상, 일반적으로 응용 프로그램에서 기록한 대부분의 줄은 DEBUG로 작성. - TRACE
가장 자세한 정보. 이것들은 로그에만 쓰여질 것으로 예상됩니다.
XML
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
<Property name="logNm">logtest</Property>
<Property name="layoutPattern">%d [%t] %-5level %c(%M:%L) - %m%n</Property></Properties><Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${layoutPattern}" />
</Console>
//
<RollingFile name="file" fileName="/log/${logNm}.log" filePattern="/log/logs/${logNm}_%d{yyyy-MM-dd}_%i.log">
<PatternLayout pattern="${layoutPattern}" />
<Policies>
<SizeBasedTriggeringPolicy size="10MB" /> <!-- 10MB 용량이 초과시 DefaultRolloverStrategy 정책만큼 넘버링 -->
<TimeBasedTriggeringPolicy module="true" interval="1" /><!-- 일별 로그 파일 생성-->
</Policies>
<DefaultRolloverStrategy max="500" fileIndex="min" /><!-- 롤링 파일 500개 까지 생성 -->
</RollingFile>
</Appenders>
<Loggers>
<!-- 기본 레벨은 debug -->
<Root level="debug" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</Root>
<!-- 스프링 프레임워크에서 찍는건 level을 info로 설정 -->
<logger name="org.springframework" level="info" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</logger><!-- 다른 기본 패키지도 설정 제어 가능하다. -->
<logger name="org.apache.commons.digester" level="info" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</logger>
<!-- rolling file에는 debug, console에는 info 분리하여 처리 가능하다. -->
<logger name="com.test" additivity="false" >
<AppenderRef ref="console" level="info" />
<AppenderRef ref="file" level="debug" />
</logger>
</Loggers>
</Configuration>
- Configuration
- 최상위 요소이다. 하위요소로 Logger, Appender, Layout 등이 있다.
- status 속성은 log4j2 내부 동작이 어떤식으로 하는지 확인, logging 할건지에 대한 설정값을 부여하는 부분
<Configuration status="INFO">
2. Properties
- xml안에서 내부 변수를 사용할 경우 properties에서 정의한다.
- 아래는 layoutPattern 이란 변수를 ${layoutPattern} 로 사용
<Properties>
<Property name="layoutPattern">%d [%t] %-5level %c(%M:%L) - %m%n</Property>
</Properties><Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${layoutPattern}" />
</Console>
3. Appenders
- Appenders는 로그가 출력되는 위치를 나타냄
- 정의한 name은 AppenderRef 태그에서 참조를 할 때 사용
- 태그 별 출력 위치
<Console> : 콘솔
<File> : 파일
<RollingFile> : 조건에 따라 롤링(일별, 조건별 등)
<JDBC>: DB
- 아래는 Appenders 태그 안에 Console 태그를 이용하여 console이라는 이름을 갖는 system.out의 출력을 정의하는 부분이다.
FILE, RollingFile, JDBC 등이 올 수 있다.
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<File>...</File>
<RollingFile>...</RollingFile>
<JDBC>...</JDBC>
4. ConsoleAppender
- console이라는 이름을 갖는 system.out의 출력을 정의
- PatternLayout은 출력 표현 방식을 정의
> 형식은 아래 URL 참고
http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
- Properties 안에 정의한 ${layoutPattern} 변수 사용
<Console name="console" target="SYSTEM_OUT">
<!--
Properties > layoutPattern : %d [%t] %-5level %c(%M:%L) - %m%n
-->
<PatternLayout pattern="${layoutPattern}" />
</Console>
5. RollingFileAppneder
- name이 file이라는 RollingFile 태그 정의
- 파일명은 logtest.log 라는 파일로 /log/logs/ 경로에 저장
- <SizeBasedTriggeringPolicy> : 10MB 용량 초과시 DefaultRolloverStrategy 정책 만큼 넘버링
- <TimeBasedTriggeringPolicy> : 1일 단위(interval=”1")에 로그파일 새로 생성
- <DefaultRolloverStrategy> : 파일 용량 제한 초과시 최대 500개 까지 생성(max=”500")
<RollingFile name="file" fileName="/log/logtest.log" filePattern="/log/logs/logtest_%d{yyyy-MM-dd}_%i.log">
<!--
Properties > layoutPattern : %d [%t] %-5level %c(%M:%L) - %m%n
-->
<PatternLayout pattern="${layoutPattern}" />
<Policies>
<SizeBasedTriggeringPolicy size="10MB" />
<TimeBasedTriggeringPolicy module="true" interval="1" />
</Policies>
<DefaultRolloverStrategy max="500" fileIndex="min" />
</RollingFile>
6. Loggers
- 로깅 작업의 주체, 각 패키지 별, 로그 정책을 설정 할 수 있다.
- <Loggers> : 하위 요소로 <Root>, <logger> 가 존재한다.
- <Root> : 일반적인 로그 정책에 대해 정의를 할 수 있으며, 반드시 한개를 정의해야한다.
- <Logger> : 여러개 정의를 할수 있으며 name에 정의하는 패키지 범위를 설정 할 수 있다.
- <AppenderRef> : 위에 정의한 Appender 의 참조를 지정 한다. Root, Logger 태그 안에서만 사용가능
- name : 로그의 name, 로그를 정의할 패키지의 범위
- level : 로그의 Level(위에 log level 참고)
- additivity : 중복로깅여부
<Console name="console" target="SYSTEM_OUT">
...<RollingFile name="file"
...<Loggers>
<Root level="debug" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</Root>
<logger name="org.springframework" level="info" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</logger>
6.1 패키지 별 로그 출력 지정
- Log 예시
2. 패키지 구분
- org.springframework.web.*
- org.springframework.beans.*
3. log4j xml에서 logger 범위 설정
> org.springframework.web
- level : console=info, file=debug로 기록 되도록 설정
- 로그가 100MB가 넘으면 다음 파일 생성
> org.springframework.beans
- level : console=info, file=debug로 기록 되도록 설정
- 로그가 50MB가 넘으면 다음 파일 생성
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="${layoutPattern}" />
</Console>
<RollingFile name="file" fileName="/log/log.log" filePattern="/log/log.log">
<PatternLayout pattern="%d %5p" />
<SizeBasedTriggeringPolicy size="100MB" />
</RollingFile><RollingFile name="file1" fileName="/log/logfile.log" filePattern="/log/logfile.log">
<PatternLayout pattern="[%c] %m%n" />
<SizeBasedTriggeringPolicy size="50MB" /></RollingFile><Loggers>
<Root level="info" additivity="false" >
<AppenderRef ref="console" />
<AppenderRef ref="file" />
</Root>
<logger name="org.springframework.web" additivity="false" >
<AppenderRef ref="console" level="info"/>
<AppenderRef ref="file" level="debug" />
</logger> <logger name="org.springframework.beans" additivity="false" >
<AppenderRef ref="console" level="debug"/>
<AppenderRef ref="file1" level="debug" />
</logger>
마무리
- 이외 많은 기능들이 있지만 기본 골격 구조에 태그 속성을 잘 설정해주면 어렵지 않게 xml을 설정 할 수 있을것이라 생각된다.
참고
- https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte3:fdl:설정_파일을_사용하는_방법
- https://stackoverflow.com/questions/21065854/what-does-status-mean-in-log4j2-configuration
- https://engkimbs.tistory.com/861
- https://logging.apache.org/log4j/log4j-2.3/manual/configuration.html
- https://en.wikipedia.org/wiki/Log4j