본문 바로가기

Spring

Spring log4j 라이브러리란?

log4j란?

log4j는 자바기반의 로깅 유틸리티이며 Apache에서 만든 오픈소스 라이브러리이다.

log4j는 옵션 설정을 통해서 선택적으로 로그를 남기거나 특정파일에 로그를 생성하는 다양한 이점이 존재한다.

 

log4j Level

  • FATAL
  • 아주 심각한 에러가 발생한 상태를 나타냄
  • ERROR
  • 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타냄
  • WARN
  • 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄
  • INFO
  • 어떠한 상태변경과 같은 정보성 메시지를 나타냄
  • DEBUG
  • 개발 시 디버그 용도로 사용하는 메시지를 나타냄
  • TRACE
  • 디버그 레벨이 너무 광범위한 것을 해결하기 위해서 좀더 상세한 이벤트를 나타냄

출력 레벨 설정에 따라 설정 레벨 이상의 로그가 출력된다.

예) 출력 레벨을 INFO라고 설정했다면, INFO보다 높은 레벨인 WARN, ERROR, FATAL이 출력

 

log4j 구성요소

  • Logger- 출력할 메시지를 Appender에 전달한다.
  • Appender
    • 전달된 로그를 어디에 출력할지 결정한다.(콘솔 출력, 파일기록, DB 저장 등)
  • Layout
    • 로그를 어떤 형식으로 출력할지 결정한다.

log4j logger Name

  • sqlonly- SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument값으로 대체된 SQL문이 보여진다.
  • sqltiming- SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보를 포함한다.
  • audit- ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야할 필요가 있는 경우를 제외하고는 사용하지 않는다.
  • resultset
    • ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성된다.

log4j Appender 요소

  • Console
  • org.apache.log4j.ConsoleAppender
  • 콘솔에 로그메시지를 출력한다.
  • Filer
  • org.apache.log4j.FilerAppender
  • 로그메시지를 지정된 파일에 기록한다.
  • RollingFile
  • org.apache.log4j.RollingFileAppender
  • 파일크기가 일정 수준이상이 되면 기존 파일을 백업파일로 두고 처음부터 다시 기록한다.
  • DailyRollingFiler
  • org.apache.log4j.Daily.Rolling.File.Appender
  • 일정기간 단위로 로그파일을 생성하고 기록한다.

log4j Layout 패턴

패턴 설명
%m 로그 내용 출력
%p debug, info, warn, error 등의 priority
%r 어플리케이션 시작 후 이벤트가 발생하는 시점까지의 시간경과(밀리세컨드로 출력)
%c package 출력
%C 클래스명 출력
%d 이벤트 발생 날짜 출력
%n 개행문자(\n) 출력
%M 로깅이 발생한 method 이름 출력
%F 로깅이 발생한 프로그램 파일명 출력
%L 로깅이 발생한 caller 정보 출력
%l 로깅이 발생한 caller 라인 수 출력
%x 로깅이 발생한 thread와 관련된 NDC 출력
%X 로깅이 발생한 thread와 관련된 MDC 출력
% %출력표시
%t 스레드 이름 출력

 

Pom.xml 설정 예시

	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-slf4j-impl</artifactId>
		<version>2.0</version>
	</dependency>

	<dependency>
			<groupId>com.googlecode.log4jdbc</groupId>
			<artifactId>log4jdbc</artifactId>
			<version>1.2</version>
			<exclusions>
				<exclusion>
					<artifactId>slf4j-api</artifactId>
					<groupId>org.slf4j</groupId>
				</exclusion>
			</exclusions>
	</dependency>

 

 

log4j2.xml 설정예시

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
		<Appenders>
		<Console name="console" target="SYSTEM_OUT">
				<PatternLayout pattern="[%d{HH:mm:ss,SSS}-%-5p] %m (%F.%M():%L) [%c]%n"/>
		</Console>
				<RollingFile name="dailyRollingFile" fileName="./logs/lulu/LuluPortal.log" filePattern="./logs/lulu/LuluPortal_%d{yyyy-MM-dd}.log">
						<PatternLayout pattern="[%d{HH:mm:ss,SSS}-%-5p] %m (%F.%M():%L) [%c]%n"/>
				<Policies>
						<TimeBasedTriggeringPolicy />
				</Policies>
		</RollingFile>
</Appenders>
<Loggers>
    
    <Logger name="com.duzon.common" level="DEBUG" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" level="INFO" />
    </Logger>
    
    <Logger name="com.duzon.lulu" level="DEBUG" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" level="INFO" />
    </Logger>
     
    <Logger name="java.sql" level="INFO" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" />
    </Logger>
    <Logger name="jdbc.sqltiming" level="INFO" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" />
    </Logger>
    
    <Logger name="org.springframework" level="INFO" additivity="false">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" />
    </Logger>
    
    <Root level="ERROR">
        <AppenderRef ref="console" />
        <AppenderRef ref="dailyRollingFile" />
    </Root>
    
</Loggers>
</Configuration>