본문 바로가기
Java/Java

Log4j) Log4j 사용법, 설정파일

by 박채니 2022. 8. 4.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


Log4j

- 로그를 자동으로 출력해주는 오픈소스 라이브러리

- 출력하고자 하는 로그를 '콘솔', '로그파일', 'DB파일' 등으로 남길 수 있음

- 패키지에 따라 로그가 수집됨

 

Maven을 이용하여 다운받아주었습니다.

pom.xml

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

 

Log4j의 설정파일을 build-path에 위치!

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration
	xmlns:log4j='http://jakarta.apache.org/log4j/'>
	
	<!-- 자식태그는 appender, logger, root 태그 순으로 작성해야 함 -->
	
	<!-- 로그 출력 주체 -->
	<appender name="console"
		class="org.apache.log4j.ConsoleAppender">
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
		</layout>
	</appender>
	
	<!-- 로그 수집 주체 -->
	<logger name="com.ce.app" > <!-- additivity="true" 기본값 -->
		<level value="info" />
	</logger>
	
	<root> <!-- logger에 존재하지 않는 패키지들이라면 root를 따름 -->
		<level value="DEBUG" />
		<appender-ref ref="console" />
	</root>
<!-- 
	패턴문자
	* %c : 카테고리명(logger이름)을 표시
	    * 카테고리명이 hello.world.logger일때, %c{2}는 world.logger를 출력
	* %C : 클래스명을 표시함.    
	    * 풀 클래스 명이 com.kh.logger일때, %C{2}는 kh.logger를 출력
	* %d : 로그 시간을 출력한다. java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있다. 
	    * %d{HH:mm:ss, SSS}
	    * %d{yyyy MMM dd HH:mm:ss, SSS}
	    * %d{ABSOLUTE} 
	    * %d{DATE} 
	    * %d{ISO8601}
	* %F : 파일명을 출력. 로그시 수행한 메소드, 라인번호가 함께 출력된다.
	* %l : 로깅이 발생한 caller의 위치정보.메소드명 (자바파일명:라인번호) - 링크제공
	* %L : 라인 번호만 출력한다(링크없음)
	* %m : 로그로 전달된 메시지를 출력한다.
	* %M : 로그를 수행한 메소드명을 출력한다. 
	* %n : 플랫폼 종속적인 개행문자가 출력. rn 또는 n
	* %p : 로그 이벤트명등의 priority 가 출력(debug, info, warn, error, fatal )
	* %r : 로그 처리시간 (milliseconds)
	* %t : 로그이벤트가 발생된 쓰레드의 이름을 출력
	* %% : % 표시를 출력. escaping
	* %r : 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
	* %X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. %X{key} 형태.
 -->
</log4j:configuration>

가장 구체적으로 패키지를 선언한 곳에서 가장 먼저 수집되며, 수집된 로그가 root까지 올라갑니다.

root태그에 <appender-ref>의 ref가 'console'로 지정되어있는데, 이를 appender태그의 'console'로 전달됩니다.

그러면 ConsoleAppender객체가 만들어져서 정해놓은 패턴에 따라 로그를 출력해줍니다.

 

logger 태그의 additivity 속성은 수집된 로그를 root까지 올려주느냐 마느냐를 설정해주는 것으로, true가 기본 값입니다.

(false - 버블링을 막음)

 

logger태그에서 처리하지 못하는 다른 패키지가 있다면, root 태그의 level를 따라가게 됩니다.

 

Log4jTest

public class Log4jTest {
	static final Logger log = Logger.getLogger(Log4jTest.class);

	public static void main(String[] args) {
		log.fatal("fatal!");
		log.error("error!");
		log.warn("warn!");
		log.info("info!");
		log.debug("debug!");
		log.trace("trace!");
	}
}

@콘솔출력값
2022-08-04 20:19:31 FATAL Log4jTest:9 - fatal!
2022-08-04 20:19:31 ERROR Log4jTest:10 - error!
2022-08-04 20:19:31 WARN  Log4jTest:11 - warn!
2022-08-04 20:19:31 INFO  Log4jTest:12 - info!

logger에서 com.ce.app 패키지에 한하여 level를 'info'로 주었기 때문에 info 하위의 'debug!', 'trace!'는 출력되지 않는 것을 확인할 수 있습니다.

만약 xml파일에서 level를 'debug'로 해준다면, debug까지 출력되겠죠.

(운영모드에서는 warn 혹은 info로 level를 지정)

 

fatal - 아주 심각한 에러

error - 처리 도중 오류(예외) 발생

warn - 현재 프로그램 실행에는 문제되지 않지만 향후 시스템의 잠재적 오류가 될 수 있는 경우

info - 프로그램 실행 중 상태 변경 등의 메세지

debug - 개발 도중 필요한 메세지

trace - 흐름의 시작과 끝을 정의하는 용도

LIST