Log4j2 공식 문서 읽어보기

굴착드릴·2024년 7월 5일

Drilling

목록 보기
3/12

아파치 log4j2 공식문서Log4j2 github를 토대로 정리했습니다.

Log4j2 Architecture

Class diagram


https://logging.apache.org/log4j/2.12.x/images/Log4jClasses.jpg

아키텍쳐를 대략적으로 살펴보겠습니다.

LoggerContext

  • 하나의 standalone 어플리케이션은 하나의 LoggerContext를 가집니다.
    • war배포 등의 환경에서는 여러 context를 가집니다.
  • Logger 객체들을 관리합니다.
    	> Aggregation인 것을 보아 Logger들을 DI 받는 것으로 보여집니다.

Configuration

Filter, Appender, StrSubstitutor등을 객체를 관리합니다.

Log4j2는 설정파일을 읽어 Configuration을 생성합니다.

Configuration filter

전체 로그 시스템에 적용되어, 모든 로그 이벤트가 평가되기 전에 전역적으로 필터링됩니다.

모든 Logger와 Appender로 전달되기 전에 로그 이벤트를 전역적으로 평가합니다.

Logger

실제로 로그를 처리하는 역할을 수행하지 않습니다
이벤트의 처리는 LoggerConfig에 위임합니다.

Logger는 고유한 이름을 가지며 LogManager.getLogger를 호출하여 생성됩니다.

@Slfj를 통해 쓰는 Logger와 혼동하면 안됩니다.

LoggerConfig

Logger로 부터 전달받은 로그 이벤트를 처리합니다.

필터링, 로그 레벨 평가등의 작업을 진행 후 조건에 맞다면 Appender에 전달합니다.

LoggerConfig Filter

LoggerConfig에 설정된 filter를 통해 필터링합니다.

Configuration filter -> Logger filter

Appender

이름 그대로 로그 이벤트를 외부로 전달하는 역할을 담당합니다.
사용 가능한 appender의 종류는 29가지 입니다.

특정 기술과 관련된 appender를 제외한 appender 중 몇가지만 살펴보겠습니다.

  • ConsoleAppender
    • 콘솔에 출력합니다.
  • FileAppdender
    • 단일 파일에 기록합니다.
  • RollingFileAppender
    • 특정 조건(시간, 크기 등)에 따라 로그파일을 롤링(생성, 기록)합니다.
  • AsyncAppender
    • 비동기적으로 로그 이벤트를 처리합니다.
    • 메세지큐를 사용하여 처리합니다.
    • 다른 appender를 참조하여 사용됩니다.

Layout

로그가 출력될 형식입니다.

  • format string 형태로 지정합니다.
    • %d{yyyy-MM-dd HH:mm:ss.SSS} : 날짜의 포맷을 다음과 같이 출력합니다.
  • 프로그램 내부에서 사용하는 값들을 변수로 바인딩 할 수 있습니다.
    • %X{id} : ThreadContext에서 key가 id인 값을 찾아 바인딩합니다.
    • 변수의 바인딩은 StrSubstitutor에서 진행합니다.

Appender filter

Appender는 외부로 log를 전달합니다. 따라서 appender의 filter는 가장 마지막으로 처리됩니다.

Configuration filter -> Logger filter -> Appender filter

Filter

Filter들은 아래 요소를 통해 로그이벤트를 필터링합니다.

  • 로그레벨
  • 메세지 내용
  • 로거 이름
  • 스레드 정보

StrSubstitutor

StrLookUp

주어진 String key를 통해 String value를 가져오기 위해 작성된 interface입니다.

구현체는 map, database 등등에 질의를 합니다.

Log4j2에서는 대표적으로 ThreadContext에서 값을 가져옵니다.

  • ThreadContext class는 Log4j2에서 thread-local을 기반으로 만든 map class입니다.

StrLookUp Apache docs

Interpolator

Interpolator는 다양한 StrLookup을 순차적으로 조회하여 변수 값을 찾고, 필요 시 치환합니다.

StrSubstitutor

StrSubstitutor는 Interpolator를 사용하여 템플릿 문자열에서 변수를 실제 값으로 치환합니다.

전체적인 과정

  • Logger에서 로그 이벤트가 발생합니다.
  • Logger는 LoggerContext를 통해 Configuration에 전달하여 filtering을 수행합니다.
  • Configuration filtering을 통과하면 LoggerConfig로 전달됩니다.
  • LoggerConfig에서 통해 filtering이 수행됩니다.
  • LoggerConfig filtering을 통과하면 알맞는 Appender에게 전달됩니다.
  • Appender에서 filtering을 수행합니다.
  • Appender에서 filtering을 통과하면 layout에 맞게 메세지를 작성합니다.
  • 이 때 메세지의 변수 바인딩을 Configuration의 StrSubsitutor에 의해 진행됩니다.

Log4j2 configuration

Configuration Architecture

Configuration Architecture의 핵심 목표설정을 읽어 AbstractConfiguration가 Appender등의 객체를 생성할 수 있게 하는 것입니다.

과정은 아래와 같습니다.

  • ConfigurationFactory를 통해 파일을 읽어옴
    • 이 때 파일 우선순위는 .properties, .yml, .json, .xml 순서입니다.
    • ConfigurationFactory는 abstract class이며 파일 양식에 따라 알맞은 ConfigurationFactor(ex XMLConfigurationFactory등)가 configure를 생성합니다.
  • 읽어들인 config 확장자에 맞는 Configuration 객체 생성
    • Configuration은 interface이며 AbstractConfiguration은 이를 구현하는 abstract class입니다.
    • AbstractConfiguration을 상속받은 Configuration에는 JsonConfiguration, XMLConfiguration등이 있습니다.
  • 각 Configuration은 설정 파일을 pasring하여 node로 변환 후 tree 구성
    • properties의 경우 파일 자체가 계층적 구조가 아니기에 트리로 변환하는데 오버헤드가 존재합니다.
  • Tree를 기반으로 Apender등 객체 생성
  • LoggerContext에 Congfiguration을 전달하여 로그 설정 초기화
    • LoggerContext.start(configuration)

Auto configuring


https://logging.apache.org/log4j/2.12.x/manual/configuration.html

Log4j2는 어플리케이션이 시작되면 자동으로 configuring을 합니다.

아래는 ConfigurationFactory를 통해 Configure 파일을 찾는 과정입니다.

  1. application.yml or properties에서 log4j.configurationFile 속성에 정의 된 파일 경로 확인
  2. 파일 경로가 없다면 ConfigurationFactory class 를 통해 file을 찾음
  3. ConfigurationFactory에서 찾지 못했다면 DefaultConfiguration을 사용

ConfigurationFactory

ConfigurationFactory는 다음과 같은 순서로 찾습니다.

  1. classpath내 log4j2-test.properties 탐색
  2. classpath내 log4j2-test.yaml log4j2-test.yml 탐색
  3. classpath내 log4j2-test.json log4j2-test.jsn 탐색
  4. classpath내 log4j2-test.xml 탐색
  5. classpath내 log4j2. properties 탐색
  6. classpath내 1og4j2.yaml Log4j2.yml 탐색
  7. classpath내 log4j2.json log4j2.jsn 탐색
  8. classpath내 log4j2.xml 탐색

자세히는 각 ConfigurationFactory 구현체가 getConfiguration을 호출합니다.
이 때 우선순위가 가장 높은 ConfigurationFactory가 null을 반환하면 그 다음 ConfigurationFactory의 getConfiguration을 검사하는 방식으로 진행됩니다.

from ConfigurationFactory apache docs

application config file vs log4j2 config file

위 과정을 보면 아시다시피 log4j2 config file은 application config보다 더 늦게 로드되기 때문에 동일한 항목이 있다면 log4j2 file에 작성한 옵션으로 덮어씌워집니다.

Auto configuring 요약

1. Log4j2는 따로 설정 없이 자동으로 configuring을 진행합니다.
2. Log4j2 config file의 확장자의 우선순위는 .properties, .yml, .json, .xml 순입니다.
3. 파일 이름에 -test가 붙어있는 파일을 우선으로 가져옵니다.
4. Log4j2 config file의 우선순위가 application.yml보다 높습니다.


profile
두두두두..

0개의 댓글