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

https://logging.apache.org/log4j/2.12.x/images/Log4jClasses.jpg
아키텍쳐를 대략적으로 살펴보겠습니다.

> Aggregation인 것을 보아 Logger들을 DI 받는 것으로 보여집니다.Filter, Appender, StrSubstitutor등을 객체를 관리합니다.
Log4j2는 설정파일을 읽어 Configuration을 생성합니다.
전체 로그 시스템에 적용되어, 모든 로그 이벤트가 평가되기 전에 전역적으로 필터링됩니다.
모든 Logger와 Appender로 전달되기 전에 로그 이벤트를 전역적으로 평가합니다.

실제로 로그를 처리하는 역할을 수행하지 않습니다
이벤트의 처리는 LoggerConfig에 위임합니다.
Logger는 고유한 이름을 가지며 LogManager.getLogger를 호출하여 생성됩니다.
@Slfj를 통해 쓰는 Logger와 혼동하면 안됩니다.

Logger로 부터 전달받은 로그 이벤트를 처리합니다.
필터링, 로그 레벨 평가등의 작업을 진행 후 조건에 맞다면 Appender에 전달합니다.
LoggerConfig에 설정된 filter를 통해 필터링합니다.
Configuration filter -> Logger filter

이름 그대로 로그 이벤트를 외부로 전달하는 역할을 담당합니다.
사용 가능한 appender의 종류는 29가지 입니다.
특정 기술과 관련된 appender를 제외한 appender 중 몇가지만 살펴보겠습니다.
로그가 출력될 형식입니다.
%d{yyyy-MM-dd HH:mm:ss.SSS} : 날짜의 포맷을 다음과 같이 출력합니다.%X{id} : ThreadContext에서 key가 id인 값을 찾아 바인딩합니다.StrSubstitutor에서 진행합니다.Appender는 외부로 log를 전달합니다. 따라서 appender의 filter는 가장 마지막으로 처리됩니다.
Configuration filter -> Logger filter -> Appender filter

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

주어진 String key를 통해 String value를 가져오기 위해 작성된 interface입니다.
구현체는 map, database 등등에 질의를 합니다.
Log4j2에서는 대표적으로 ThreadContext에서 값을 가져옵니다.
ThreadContext class는 Log4j2에서 thread-local을 기반으로 만든 map class입니다.Interpolator는 다양한 StrLookup을 순차적으로 조회하여 변수 값을 찾고, 필요 시 치환합니다.
StrSubstitutor는 Interpolator를 사용하여 템플릿 문자열에서 변수를 실제 값으로 치환합니다.

Configuration Architecture의 핵심 목표는 설정을 읽어 AbstractConfiguration가 Appender등의 객체를 생성할 수 있게 하는 것입니다.
과정은 아래와 같습니다.
LoggerContext.start(configuration)
https://logging.apache.org/log4j/2.12.x/manual/configuration.html
Log4j2는 어플리케이션이 시작되면 자동으로 configuring을 합니다.
아래는 ConfigurationFactory를 통해 Configure 파일을 찾는 과정입니다.
application.yml or properties에서 log4j.configurationFile 속성에 정의 된 파일 경로 확인ConfigurationFactory class 를 통해 file을 찾음ConfigurationFactory에서 찾지 못했다면 DefaultConfiguration을 사용ConfigurationFactory는 다음과 같은 순서로 찾습니다.
log4j2-test.properties 탐색log4j2-test.yaml log4j2-test.yml 탐색log4j2-test.json log4j2-test.jsn 탐색log4j2-test.xml 탐색log4j2. properties 탐색1og4j2.yaml Log4j2.yml 탐색log4j2.json log4j2.jsn 탐색log4j2.xml 탐색자세히는 각 ConfigurationFactory 구현체가 getConfiguration을 호출합니다.
이 때 우선순위가 가장 높은 ConfigurationFactory가 null을 반환하면 그 다음 ConfigurationFactory의 getConfiguration을 검사하는 방식으로 진행됩니다.
위 과정을 보면 아시다시피 log4j2 config file은 application config보다 더 늦게 로드되기 때문에 동일한 항목이 있다면 log4j2 file에 작성한 옵션으로 덮어씌워집니다.
1. Log4j2는 따로 설정 없이 자동으로 configuring을 진행합니다.
2. Log4j2 config file의 확장자의 우선순위는 .properties, .yml, .json, .xml 순입니다.
3. 파일 이름에 -test가 붙어있는 파일을 우선으로 가져옵니다.
4. Log4j2 config file의 우선순위가 application.yml보다 높습니다.