개요
이 포스트는 소스상에서 로그 메시지를 핸들링하기 내용이다.
log4j를 자바 소스로 구현해보자
(logj4-1.2.17.jar 라이브러리 기준으로 작성됨)
1. 설정
2. 실행
1. 설정
Logger / Appender / Layout 설정
설정 흐름
1. 어떤 어펜더(출력)를 사용할지?
2. 어펜더에 따라 어떤 레이아웃(포맷)을 적용할지?
3. 어펜더와 로거의 레벨 설정
예시) 콘솔 어펜더 / 패턴레이아웃 사용
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
public class LoggerTest
{
public static void main( String[] args )
{
// 패턴레이아웃 클래스 사용시 적용
String pattern = "%m%n";
Layout layout = new PatternLayout(pattern);
// 콘솔어펜더 사용시 적용
ConsoleAppender console = new ConsoleAppender();
console.setLayout(layout); // 어펜더에 레이아웃 적용
console.setThreshold(Level.ALL); // 어펜더 레벨 제한
console.activateOptions();// 어펜더 설정 적용
// 로거를 사용한다고 정의
Logger logger = Logger.getLogger(LoggerTest.class); // 로거 이름을 생성자에 적용
logger.addAppender(console); // 어펜더 설정을 로거에 적용
logger.setAdditivity(false); // 로거 중복 사용 여부
logger.setLevel(Level.ALL); // 로거의 레벨 설정
System.out.println(logger.getName());
logger.fatal("logger.fatal()");
logger.error("logger.error()");
logger.info("logger.info()");
logger.debug("logger.debug()");
if ( logger.isEnabledFor(Level.INFO) )
{
logger.info("enabeld info");
}
if ( logger.isEnabledFor(Level.DEBUG) )
{
logger.debug("enabeld debug");
}
}
}
2. 실행
Logger.{레벨}(메시지) 전달
메시지 핸들링은 레벨 설정을 통해 진행
위 설정을 토대로 실행(런)하면 아래와 같이 콘솔창에 표시된다.
LoggerTest // 로거 이름(클래스로 주어서 이와 같이 정해짐)
logger.fatal() // 파탈 메시지
logger.error() // 에러 메시지
logger.info() // 인포 메시지
logger.debug() // 디버그 메시지
enabeld info // 로거레벨이 INFO이상 활성화되었을 때 가능
enabeld debug // 로거레벨이 DEBUG이상 활성화 되었을 때 가능
우리는 이제 레벨을 변경하여 해당 로거는 어떤 레벨 단계에서 표시할지 정할 수 있게 된다.
현재 위 설정은 모두 ALL로 맞춘 상태이다.
설정 요령은
1. 어펜더의 setThreadhold()를 설정하고 로거의 setLevel()을 설정한다
2. setThreadhold()는 출력어펜더마다 레벨을 따로 설정하는 것이다.
3. setLevel()은 해당 로거 레벨을 활성화 시켜주는 것이다. 해당 레벨까지 인식 가능하다는 말이다.
각각 1개의 어펜더와 로거를 사용해서 그렇지 하나의 로거에 여러개 어펜더가 있다고 하고
콘솔어펜더는 모두 표기하되 파일어펜더 INFO만 원하는 경우 로거레벨은 ALL로 설정을 해줘야한다.
즉, 로거에서 활성화 단계까지 다루고 각 어펜더 레벨에 맞춰 로그를 보내주게 된다.
처음에는 어려울 수 있으나
본인의 프로젝트에서 해당 어펜더는 어떤 로그레벨이 필요하며
로거는 어디까지 활성화 시켜야하는지 스스로 생각하고 소스를 짜야된다.
'프로그래밍 언어 > 자바' 카테고리의 다른 글
this vs getClass() (0) | 2023.07.31 |
---|---|
[자바] 예외클래스 (0) | 2021.09.17 |
[자바] 로그(log)란? (2) | 2021.06.09 |
[자바] I/O(입출력) Stream이란? (0) | 2021.06.05 |
[자바] 문자열 클래스 - String / StringBuffer / StringBuilder의 차이점 (0) | 2021.05.22 |