log4j2 xml 설정

박상수
12 min readOct 28, 2019

--

log4j2에서 xml설정 간 제일 중요한것은 xml 설정이라 생각된다.
그래서 실제 사용하는 xml을 기반(살짝 편집한)으로 하나하나 뜯어보도록 하자.

Level

전제조건으로 로그의 level이 무엇을 뜻하는지 알아야 나머지 설정을 원할하게 할수 있으므로 알아보도록 하자
https://en.wikipedia.org/wiki/Log4j

  1. OFF
    가능한 가장 높은 순위이며 로깅을 해제
  2. FATAL
    조기 종료를 유발하는 심각한 오류. 콘솔에 즉시 표시 될 것으로 예상
  3. ERROR
    런타임 오류 또는 예기치 않은 조건. 콘솔에 즉시 표시
  4. ̶W̶A̶R̶N̶
    더 이상 사용되지 않는 API 사용, ‘거의’오류에 가까운 상황.
    상태 콘솔에 즉시 표시
  5. INFO
    런타임 이벤트. 콘솔에 즉시 보일 것으로 예상되므로 보수적이며 최소한으로 유지
  6. DEBUG
    시스템을 통한 흐름에 대한 자세한 정보.
    로그에만 쓰여질 것으로 예상, 일반적으로 응용 프로그램에서 기록한 대부분의 줄은 DEBUG로 작성.
  7. 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>
  1. 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 패키지 별 로그 출력 지정

  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을 설정 할 수 있을것이라 생각된다.

참고

--

--

No responses yet