티스토리 뷰
Log4J 1.x 에서 Log4J 2.x 로 변경 하면서 공부가 필요하여 정리합니다.
---------------------------------------------------------------------------------------------
아키텍쳐
구성 요소
※출처:apache.org/log4j
log4j 2 API를 사용하는 어플리케이션은 LogManager로부터 구체적인 이름의 Logger를 요구합니다. LogManager는 가장 적합한 LoggerContext를 찾아주고 Logger를 가져옵니다.
Logger를 작성해야 하는 경우
a)Logger와 같은 이름
b)상위 패키지의 Logger와 같은 이름
c)root LoggerConfig의 Logger와 같은이름
LoggerConfig 객체는 configuration의 Logger 선언으로부터 생성된다.
LoggerConfig는 실제 LogEvents를 전달하는 Appenders와 관련이 있다.
Logger 계층 구조
일반적인 system.out.prinln 에 비해서 logging API의 가장 큰 장점은 특정 로그문 사용하지 않아도 되고, 제약없이 다른 사용자들에게 로깅을 허락한다는 점일 것이다. 이런 점은 로깅공간, 즉 모든 사용 가능한 로깅 구문에 할당된 공간을 개발자들의 기준으로 선택하고 분류하게 한다.
Log4j 1.x에서 Logger 계층 구조는 Logger 간의 관계를 통해 유지 관리 되었다. Log4j 2에서는 이 관계가 더이상 존재하지 않는다. 대신 LoggerConfig 객체간의 관계에서 계층 구조가 유지 된다.
즉, LoggerConfig에서 name은 계층 구조를 따르고
LoggerConfig에서 name="org.apache" 는 name="org.apache.log4j"의 부모가 됩니다.
LoggerConfig 의 계층 구조에서 최상위 객체는 root 이고, 이 root LoggerConfig에 직접 연결된 Logger 객체는 다음과 같이 얻을 수 있다.
Logger logger = LogManager.getLogger(LogManager.ROOT_LOGER_NAME);
또는 간단하게:
Logger logger = LogManager.getRootLogger();
LoggerContext
LoggerContext는 로깅시스템에서 시작점같은 역할을 한다. 상황에 따라 여러 LoggerContext가 작동되도록 할수 있다.
Configuration
모든 LoggerContext는 Configuration 설정이 필요하고, Appender, Context-Wide Filters, LoggerConfigs의 설정들을 포함한다. 재설정 중에는 두개의 Configuration객체가 존재하고 설정이 끝나면 이전 구성이 중지되고 폐기되는 특징이 있다.
Logger
앞서 언급한것과 같이
Logger logger = LogManager.getRootLogger();
메소드를 총해 호출하고, 로거 객체 자체는 직접적으로 어떤 행위를 하지 않고 configurations에서 명명된 이름을 가지고 LoggerConfig과 연관되어 있다. Logger객체는 AbstractLogger를 확장하고 필요한 메서드를 구현한다. Confiquration이 변경되면 Logger는 다른 LoggerConfig와 연결된다.
LoggerConfig
LoggerConfig 객체는 로깅 구성에서 Logger가 선언 될 때 만들어 진다.
Log Levels
LoggerConfigs에는 Log Level을 설정 해 주어야 된다. TRACE, DE
BUG, INFO, WARN, ERROR, FATAL 6가지의 내장 level-set가 있다.
Log4j 1과 다르게 Log4j 2에서 Logger와 LoggerConfig는 서로 다른 객체이므로 다르게 구현된다. Logger 는 설정된 LoggerConfig를 참조하며, LoggerConfig는 해당 부모를 참조 할 수 있다.
Filter
Log4J는 LoggerConfig에 컨트롤이 전달 되기 전/후에 적용될 수 있는 Filter를 제공한다. Filter는 컨트롤이 LoggerConfig로 전달 되었지만 특정 Appender를 호출하기 전에, 각 Appender에서 Accept, Deny, Neutral 이라는 세 가지 결과 중 하나를 반환 할 수 있다. Accept응답은 다른 필터를 호출하지 말고 이벤트가 진행되야 함을 의미. Deny 응답은 이벤트가 즉시 무시되어야하고 컨트롤이 호출자에게 반환되어야 함을 의미. Neutral 응답은 이벤트가 다른 필터로 전달 되어야 함을 나타낸다. 다른 필터가 없는 경우 이벤트가 처리 된다.
Appender
Log4J에서 출력의 결과를 Appender라고 부른다. console, files, remote socket servers, Apache Flume, JMS, remote Unix Syslog daemons외 다양한 데이터 베이스 API들을 위한 Appender 있다. 하나 이상의 Appender를 Logger에 연결할 수 있다.
Appender의 Additivity 설정으로 LoggerConfig 계층 구조에서 추가로 Appender를 상속하고 출력 할수 있다. additivity = "false"를 설정하여 더이상 Appender 누적이 추가되지 않도록 설정 할 수 있다.
Layout
출력 대상뿐만 아니라 출력 형식을 정의하고 싶을때 Layout을 Appender와 연결하여 수행할 수 있다. PatternLayout은 사용자가 특정한 출력 형태를 사용할 수 있도록 해줍니다.
예를 들어, PatternLayout "%r [%t] %-5p %c - %m%n"은 다음의 내용을 출력한다.
132 [main] DEBUG org.apache - 메시지 내용
%r 는 프로그램 시작후 경과 된 시간 (밀리 초)입니다.
%t 는 로그 요청을 하는 스레드, %-5는 log level, %c는 로그 요청과 연관된 Logger의 이름 '-' 다음의 텍스트는 명령문의 메시지이다.
'Programming > Java' 카테고리의 다른 글
Gson.fromJson(..) 으로 Map 변환 시 Integer 형이 Double 형으로 바뀌는 문제 (0) | 2018.07.26 |
---|---|
Java Map 반복(Iteration) 시키는 방법 (0) | 2018.07.24 |
Log4j 2.x <2> - XML로 기본적인 설정하기 - (0) | 2017.11.16 |
- Total
- Today
- Yesterday
- apache tomcat 연동
- Page
- 쓰레드
- 설정정보
- apache2.x
- 프로세스의 특징
- tomcat8.x
- map loop
- application
- 빈팩토리
- 빈
- parretn
- map foreach
- java map loop
- map iterator
- tomcat8.5
- BEAN
- 연동
- map for문
- 프로세스의 문제점
- 스프링
- 디자인패턴
- 쓰레드 사용 이유
- 어플리에키션 컨텍스트
- apllication context
- 메소드
- IoC컨테이너
- 프로세스
- 패턴
- 쓰레드의 이용
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |