웹사이트 검색

Log4j 수준 예제 - 순서, 우선 순위, 사용자 지정 필터


log4j를 사용했다면 메시지를 기록하는 방법이 많다는 것을 알게 될 것입니다. 예를 들어:

logger.trace("My Log message");
logger.debug("My Log message");
logger.info("My Log message");

실제로 그들은 log4j 수준에 해당합니다.

Log4j 수준

Log4j는 다양한 로깅 수준을 제공합니다. 아래는 전체 목록입니다.

  1. TRACE: TRACE 레벨은 DEBUG보다 세분화된 정보 이벤트를 지정합니다.
  2. DEBUG: DEBUG 레벨은 응용 프로그램을 디버그하는 데 가장 유용한 세분화된 정보 이벤트를 지정합니다.
  3. INFO: INFO 수준은 대략적인 수준에서 애플리케이션의 진행 상황을 강조하는 정보 메시지를 지정합니다.
  4. 경고: WARN 수준은 잠재적으로 위험한 상황을 지정합니다.
  5. ERROR: ERROR 수준은 애플리케이션이 계속 실행될 수 있는 오류 이벤트를 지정합니다.
  6. FATAL: FATAL 수준은 응용 프로그램이 중단될 수 있는 매우 심각한 오류 이벤트를 지정합니다.
  7. ALL: ALL은 가능한 가장 낮은 순위를 가지며 모든 로깅을 켭니다.
  8. OFF: OFF는 가능한 가장 높은 순위를 가지며 로깅을 해제하기 위한 것입니다.

ALL 및 OFF는 특수 로깅 수준이며 극단적인 상황에서 사용해야 합니다. 나는 이것을 개인적으로 사용한 적이 없습니다.

Log4j 레벨 순서/우선순위

Trace는 가장 낮은 우선 순위이고 Fatal은 가장 높은 우선 순위입니다. 아래는 log4j 로깅 수준 순서입니다. 추적 < 디버그 < 정보 < 경고 < 오류 < 치명적입니다. 로거 수준을 정의하면 우선 순위가 높은 로그도 인쇄됩니다. 예를 들어 로거 레벨이 INFO이면 디버그 로그는 인쇄되지 않지만 우선 순위가 높기 때문에 경고 로그는 인쇄됩니다.

Log4j 필터

INFO 및 FATAL 이벤트만 기록하고 WARN 및 ERROR 이벤트는 기록하지 않으려고 한다고 가정해 보겠습니다. 이러한 시나리오에서는 log4j 필터의 도움을 받을 수 있습니다. org.apache.log4j.spi.Filter 클래스를 확장하고 decide(LoggingEvent event) 메서드를 구현하여 사용자 정의 필터링 기능을 제공할 수 있습니다.

package com.journaldev.log4j.filters;

import org.apache.log4j.Level;
import org.apache.log4j.spi.Filter;
import org.apache.log4j.spi.LoggingEvent;

public class MyLog4jFilter extends Filter {

	/**
	 * My custom filter to only log INFO and FATAL events
	 */
	@Override
	public int decide(LoggingEvent event) {
		if(event.getLevel() == Level.INFO || event.getLevel() == Level.FATAL)
		return ACCEPT;
		else return DENY;
	}

}

위의 사용자 지정 필터는 INFO 및 FATAL 이벤트만 기록하며, 아래는 이에 대한 XML log4j 구성입니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="https://jakarta.apache.org/log4j/"
	debug="false">

<!-- console appender -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
	<param name="Target" value="System.out" />
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
	</layout>
	<filter class="com.journaldev.log4j.filters.MyLog4jFilter" />
</appender>

<logger name="com.journaldev.log4j" additivity="false">
	<level value="TRACE" />
	<appender-ref ref="console" />
</logger>

<root>
	<priority value="DEBUG" />
	<appender-ref ref="console" />
</root>

</log4j:configuration>

콘솔 어펜더에서 Filter 클래스의 사용법에 주목하십시오. 다음은 기본 로깅을 수행하는 간단한 클래스입니다.

package com.journaldev.log4j.main;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.xml.DOMConfigurator;

public class Log4jExample {

	static {
		init();
	}

	private final static Logger logger = Logger.getLogger(Log4jExample.class);

	public static void main(String[] args) {
		logger.trace("My Trace Log");
		logger.debug("My Debug Log");
		logger.info("My Info Log");
		logger.warn("My Warn Log");
		logger.error("My error log");
		logger.fatal("My fatal log");
	}

	/**
	 * method to init log4j configurations
	 */
	private static void init() {
		DOMConfigurator.configure("log4j.xml");
	}

}

이 프로그램을 실행하면 콘솔에 아래와 같은 로그가 생성됩니다.

INFO  Log4jExample - My Info Log
FATAL Log4jExample - My fatal log

자체 사용자 정의 필터 클래스를 생성하여 훨씬 더 복잡한 필터링을 수행할 수 있습니다. 이 특별한 경우에는 아래 appender에 표시된 것처럼 org.apache.log4j.varia.LevelMatchFilterorg.apache.log4j.varia.DenyAllFilter 클래스를 사용할 수 있습니다.

<appender name="console" class="org.apache.log4j.ConsoleAppender">
	<param name="Target" value="System.out" />
	<layout class="org.apache.log4j.PatternLayout">
		<param name="ConversionPattern" value="%-5p %c{1} - %m%n" />
	</layout>
	<filter class="org.apache.log4j.varia.LevelMatchFilter">
		<param name="LevelToMatch" value="INFO" />
        	<param name="AcceptOnMatch" value="true" />
	</filter>
	<filter class="org.apache.log4j.varia.LevelMatchFilter">
		<param name="LevelToMatch" value="FATAL" />
        	<param name="AcceptOnMatch" value="true" />
	</filter>
	<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

또한 특정 범위를 벗어난 우선순위를 가진 메시지를 거부하는 데 사용할 수 있는 org.apache.log4j.varia.LevelRangeFilter 클래스도 있습니다. 이것이 log4j 레벨과 필터에 대한 빠른 이해를 위한 전부입니다. 참조:

  • Log4j 수준 API
  • Log4j 사용자 지정 필터 StackOverflow