Log4j

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Log4j는 자바 기반의 로깅 유틸리티로, 다양한 수준의 로그를 지원하며 애플리케이션의 상태를 기록하는 데 사용된다. Log4j는 OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE 등 여러 로그 레벨을 제공하며, 설정 파일을 통해 로깅 방식을 유연하게 구성할 수 있다. C, C++, 자바스크립트 등 다양한 프로그래밍 언어로 포팅되어 사용되며, Log4Shell 취약점(CVE-2021-44228)과 같은 보안 문제로 인해 주목받기도 했다.

Log4j - [IT 관련 정보]에 관한 문서
기본 정보

이미지 준비중입니다.

아파치 Log4j 로고
개발아파치 소프트웨어 재단
최초 출시일2001년 1월 8일
저장소https://github.com/apache/logging-log4j2
프로그래밍 언어자바
종류로깅
라이선스아파치 라이선스 2.0
웹사이트https://logging.apache.org/log4j/2.x/
기타 관련 정보
관련 프로젝트SLF4J(가칭)
http://reload4j.qos.ch/
http://logback.qos.ch/
📚 더 읽어볼만한 페이지
  • 공식 웹사이트에 알 수 없는 변수를 사용한 문서 - 브루클린 미술관
    브루클린 미술관은 1823년 브루클린 견습생 도서관으로 시작하여 현재 약 50만 점의 소장품을 보유한 뉴욕 브루클린 소재의 미술관으로, 다양한 분야의 예술 작품을 전시하며 특히 아프리카 미술과 여성주의 미술에 대한 기여가 크다.
  • 공식 웹사이트에 알 수 없는 변수를 사용한 문서 - 광주지방기상청
    광주지방기상청은 광주광역시와 전라남도 지역의 기상 예보, 특보, 관측, 기후 정보 제공 등의 업무를 수행하는 기상청 소속 기관으로, 1949년 광주측후소로 설치되어 1992년 광주지방기상청으로 개편되었으며, 기획운영과, 예보과, 관측과, 기후서비스과와 전주기상지청, 목포기상대를 두고 있다.
  • 아파치 소프트웨어 재단 프로젝트 - 아파치 루씬
    아파치 루씬은 더그 커팅이 개발한 오픈 소스 전문 검색 라이브러리이며, 텍스트 색인 및 검색 기능을 제공하여 웹 검색 엔진, 퍼지 검색, 추천 시스템 구현 등에 사용된다.
  • 아파치 소프트웨어 재단 프로젝트 - 아파치 하둡
    아파치 하둡은 대용량 데이터를 분산 처리하기 위한 자바 기반의 오픈 소스 프레임워크로, HDFS, 맵리듀스, YARN 등의 모듈로 구성되어 클라우드 환경에서도 사용된다.
  • 자바로 작성된 자유 소프트웨어 - Jitsi
    Jitsi는 오픈 소스 화상 회의 솔루션으로, 학생 프로젝트에서 시작하여 여러 회사를 거쳐 현재 8x8에 인수되었으며, Jitsi Meet 등을 통해 간편한 화상 회의 기능을 제공하지만 개인 정보 보호에 대한 비판도 존재한다.
  • 자바로 작성된 자유 소프트웨어 - I2P
    I2P는 2003년 Freenet에서 분기된 익명 P2P 분산 통신 계층으로, IP 주소 노출을 방지하며 다양한 소프트웨어와 익명성 응용 프로그램을 지원하고, 기부금으로 운영되며 6~8주마다 릴리스를 진행한다.

2. 기능

Log4j 2는 Log4j 1의 후속 버전으로, 기존 로깅 솔루션들의 영향을 받아 완전히 새롭게 개발되었다. Log4j 1에 비해 다음과 같은 주요 개선 사항들이 있다:

* 안정성 향상: 프레임워크 재구성 중 메시지 손실이 발생하지 않는다.
* 확장성: 플러그인 시스템을 지원하여 사용자가 직접 구성 요소를 만들 수 있다.
* 구성 단순화: 구성 문법이 간결해졌다.
* 다양한 구성 형식 지원: XML, JSON, YAML, properties 파일 형식을 지원한다.
* 필터 기능 개선: 로그를 더 세밀하게 제어할 수 있다.
* 속성 조회 지원: 구성 파일, 시스템 속성, 환경 변수 등 다양한 위치의 값을 참조할 수 있다.
* 다중 API 지원: Log4j 2, Log4j 1.2, SLF4J, Commons Logging, java.util.logging (JUL) API를 사용할 수 있다.
* 사용자 지정 로그 레벨: 필요에 따라 로그 레벨을 직접 정의할 수 있다.
* 레이지 로깅: 자바 8 스타일의 람다 표현식을 지원하여 성능을 향상시켰다.
* 마커: 로그 메시지에 태그를 추가하여 분류할 수 있다.
* 사용자 지정 메시지 객체 지원: 메시지 형식을 자유롭게 정의할 수 있다.
* 가비지 최소화: 가비지 컬렉션 부담을 줄여 성능을 개선했다.
* 속도 향상: 특히 비동기 Logger의 성능이 크게 향상되었다.

Log4j 2의 가장 주목할 만한 기능 중 하나는 비동기 Logger의 성능이다. LMAX 디스럽터를 활용하여 커널 락의 필요성을 줄이고 로깅 성능을 12배 향상시켰다. 예를 들어, 동일한 환경에서 Log4j 2는 초당 18,000,000개 이상의 메시지를 기록할 수 있는 반면, 로그백(Logback)과 Log4j 1은 초당 2,000,000개 미만의 메시지를 기록할 수 있다.

2.1. 로그 레벨

Log4j는 로그 메시지의 중요도에 따라 여러 레벨을 제공하며, 개발자는 이를 통해 로그의 상세 정도를 조절할 수 있다. Log4j는 7가지 표준 로그 레벨을 제공하며, 설정 파일에 대상별(자바에서는 패키지)로 레벨을 지정하여 그 등급 이상의 로그만 저장한다. Log4j 2는 사용자 정의 로그 레벨을 만들 수 있도록 지원한다.

2.1.1. 표준 로그 레벨

Log4j는 7가지의 표준 로그 레벨을 제공한다. 설정 파일에 대상별(자바에서는 패키지)로 레벨을 지정하여 그 등급 이상의 로그만 저장하는 방식이다.

👆
좌우로 밀어서 보기
레벨설명
OFF로그를 끄기 위해 사용한다.
FATAL이른 종료를 일으키는 심각한 오류. 상태 콘솔에 바로 표시될 것으로 예측된다.
ERROR다른 런타임 오류 또는 예기치 못한 조건. 상태 콘솔에 바로 표시될 것으로 예측된다.
WARN구식 API의 사용, 잘 활용하지 못한 API 사용, 오류에 '가까운' 것, 그 밖에 꼭 잘못된 것은 아니지만 만족하지 못하거나 예기치 않은 런타임 상황. 상태 콘솔에 바로 표시될 것으로 예측된다.
INFO흥미로운 런타임 이벤트(시작/종료). 콘솔에 바로 표시될 것으로 예측되므로 가능한 보수적으로 최소한으로 사용한다.
DEBUG시스템 전반의 흐름에 관한 자세한 정보. 로그에만 기록될 것으로 예측된다. 일반적으로 응용 프로그램이 기록하는 대부분의 줄은 DEBUG로 작성하는 것이 좋다.
TRACE가장 세세한 정보. 로그에만 기록될 것으로 예측된다. 버전 1.2.12부터 지원.

2.1.2. 사용자 지정 로그 레벨

Log4j 2는 사용자가 자신만의 로그 레벨을 정의할 수 있게 허용한다. 소스 코드 생성기 도구를 통해 내장된 로그 레벨과 동일하게 사용자 정의 로그 레벨을 지원하는 로거를 만들 수 있다. 사용자 정의 로그 레벨은 내장된 로그 레벨을 보완하거나 대체할 수 있다.

2.2. Log4j 구성

Log4j는 구성 파일 또는 자바 코드를 통해 설정을 변경할 수 있다. 구성 파일은 XML, JSON, YAML, properties 파일 형식으로 작성할 수 있다. 구성 파일에서는 로거(Loggers), 어펜더(Appenders), 레이아웃(Layouts) 등 세 가지 주요 구성 요소를 정의한다.

* 로거 (Loggers): 로그 메시지가 도착하는 곳의 이름이다. 자바 애플리케이션에서는 이 이름을 통해 로그를 기록한다. 각 로거는 로그 레벨(FATAL, ERROR 등)을 독립적으로 설정할 수 있다. 이전 버전의 Log4j에서는 '카테고리'와 '우선순위'라고 불렀지만, 현재는 '로거'와 '레벨'이라고 부른다.
* 어펜더 (Appenders): 실제로 로그를 출력하는 역할을 담당한다. FileAppender, RollingFileAppender, ConsoleAppender, SocketAppender, SyslogAppender, SMTPAppender 등 다양한 종류가 있다. Log4j 2에서는 Apache Flume, 자바 영속성 API, Apache Kafka, NoSQL 데이터베이스, 메모리 맵 파일, 임의 접근 파일ZeroMQ 엔드포인트에 쓰는 어펜더가 추가되었다. 여러 어펜더를 하나의 로거에 연결하여 동일한 로그 정보를 로컬 파일과 다른 컴퓨터의 소켓 리스너 등 여러 곳에 동시에 출력할 수 있다.
* 레이아웃 (Layouts): 어펜더가 로그 항목의 형식을 지정하는 데 사용한다. 널리 사용되는 PatternLayout은 C/C++의 printf 함수와 유사한 패턴 문자열을 사용한다. HTML이나 XML 형식으로 로그를 출력하는 HTMLLayout과 XMLLayout도 있다. Log4j 2는 CSV, Graylog 확장 로그 형식(GELF), JSON, YAML, RFC-5424용 레이아웃을 추가했다.

Log4j는 파일을 통해 로깅을 구성하면 Log4j를 사용하는 애플리케이션을 수정하지 않고도 로깅을 켜거나 끌 수 있다는 장점이 있다. 예를 들어, 문제가 발생할 때까지 로그를 끄고, 구성 파일을 수정하여 다시 켤 수 있다.

Log4j 2는 필터(Filters) 기능을 통해 어떤 로그 항목을 어떤 로거와 어펜더에서 처리할지 세밀하게 제어할 수 있다. 로그 레벨별 필터링, 메시지 문자열에 대한 정규식 일치 외에도 버스트 필터, 시간 필터, 마커 또는 스레드 컨텍스트 맵과 같은 로그 이벤트 속성별 필터링, JSR 223 스크립트 필터 등을 사용할 수 있다.

2.2.1. Log4j 2 구성 요소

Log4j는 구성 파일이나 자바 코드를 통해 구성할 수 있다. 구성은 XML, JSON, YAML 또는 properties 파일 포맷으로 작성 가능하다. 구성 내에서 사용자는 다음 세 가지 주요 구성 요소를 정의할 수 있다.

* Loggers는 로그 메시지 도착지의 이름이다.
* Appenders는 실제 출력을 수행하는 실체이다.
* Layouts는 Appenders가 로그 항목의 서식을 지정하기 위해 사용한다.

Log4j 2는 위 구성요소 외에도 Filters 기능을 제공하여, 어느 로그 항목이 어느 Loggers와 Appenders에 의해 처리되어야 하는지를 세밀히 조절할 수 있다.

2.2.2. Log4j 구성 예시

Log4j는 프로퍼티 파일 또는 XML 파일을 사용하여 설정할 수 있다. 두 가지 설정 방식 모두 로거, 앱펜더, 레이아웃의 세 가지 주요 구성 요소를 정의한다. 설정 파일을 사용하면 Log4j를 사용하는 애플리케이션을 변경하지 않고도 로깅을 켜거나 끌 수 있다. 예를 들어, 문제가 발생할 때까지 로깅을 끈 상태로 작동하다가 설정 파일을 변경하여 로깅을 다시 시작할 수 있다.

다음은 Log4j 2와 Log4j 1.2의 XML 구성 파일 예시이다.

* Log4j 2 구성 예시:

```xml



target/test.log









%d %p %c{1.} [%t] %m%n






















```

* Log4j 1.2 구성 예시:

```xml






value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />




















2.3. TTCC

TTCC는 Log4j에서 사용하는 메시지 서식이다. TTCC는 "Time Thread Category Component"의 약자이다. 다음 패턴을 사용한다.

%r [%t] %-5p %c %x - %m%n

각 표현의 의미는 다음과 같다.

👆
좌우로 밀어서 보기
표현설명
%r로깅 이벤트 발생 전까지 레이아웃 구성에 소요된 밀리초
%t로깅 이벤트를 생성한 스레드 이름
%p로깅 이벤트의 우선순위
%c로깅 이벤트의 범주
%x로깅 이벤트를 발생시킨 스레드와 관련된 NDC(nested diagnostic context)
%X{key}특정 키에 대한 로깅 이벤트를 생성한 스레드와 관련된 MDC(mapped diagnostic context)
%m로깅 이벤트에 관련된 응용 프로그램 제공 메시지
%n플랫폼 특화 새줄문자


출력 예시

467 [main] INFO org.apache.log4j.examples.Sort - Exiting main method.

3. 포팅

Log4j는 다양한 프로그래밍 언어로 포팅되어 사용되고 있다. 다음은 Log4j의 주요 포팅 버전들이다.

👆
좌우로 밀어서 보기
프로그래밍 언어포팅 버전설명
C[http://log4c.sourceforge.net/ Log4c]C 기반의 로깅 라이브러리. LGPL 라이선스 하에 SourceForge에서 출시.
C++[https://web.archive.org/web/20070820061743/http://logging.apache.org/log4cxx/ Log4cxx]C++용 로깅 프레임워크. Apache Portable Runtime을 기반으로 함.
C++[http://log4cplus.sourceforge.net/ Log4cplus]C++용으로 이식.
[http://log4perl.sourceforge.net/ Log4perl]용 포팅.
자바스크립트[https://web.archive.org/web/20130907201220/http://log4js.berlios.de/ Log4js]자바스크립트용 포팅. Ajax를 사용하여 원격 로깅 기능 제공.
자바스크립트[http://stritti.github.io/log4js/ Log4js]자바스크립트용 포팅.
Node.js[https://log4js-node.github.io/log4js-node/ Log4js-node]Node.js용 포팅.
파이썬logginglog4j의 영향을 받은 파이썬용 공식 로깅 모듈.
루비[http://log4r.sourceforge.net Log4r]log4j의 영향을 받은 루비용 로깅 모듈.
닷넷 프레임워크[https://web.archive.org/web/20070301084859/http://logging.apache.org/log4net/ Log4net]마이크로소프트 닷넷 프레임워크로 이식.
PHP[http://logging.apache.org/log4php/ log4php]PHP용 포팅.
PL/SQL[http://log4plsql.sourceforge.net/ Log4plsql]Oracle PL/SQL용 포트.

4. Log4Shell 취약점

Log4Shell(CVE-2021-44228)은 Log4j 2에서 발견된 심각한 원격 코드 실행 취약점이다. 알리바바 그룹이 2021년 11월 24일에 발견하여 아파치에 보고했으며, 2021년 12월 9일 트위터를 통해 일반에 공개되었다. 이 취약점은 클라우드플레어, 아이클라우드, 마인크래프트: 자바 에디션, 스팀, 텐센트 QQ, 트위터 등 많은 서비스에 영향을 미쳤다.

아파치 소프트웨어 재단은 Log4Shell에 최고 수준인 CVSS 심각도 등급 10을 할당했다. 사이버 보안 회사 테너블은 이 취약점을 "지난 10년 동안 가장 크고 가장 중요한 단일 취약점"이라고 평가했다.

이 취약점을 야기하는 기능은 설정으로 비활성화할 수 있었으며, Log4j 버전 2.15.0-rc1(취약점이 공개되기 3일 전인 2021년 12월 6일에 공식 출시됨)에서 제거되었으며, 원격 조회를 제한하는 다양한 설정으로 대체되어 취약점을 완화했다. 추가적인 보안을 위해 이 취약점의 기반이 된 JNDI를 사용하는 모든 기능은 기본적으로 비활성화되며, 버전 2.16.0부터 메시지 조회를 지원하지 않는다.

5. 로그 뷰어

Chainsaw는 아파치가 Log4j에서 생성된 로그 파일을 활용하기 위해 제공하는 별도의 프로젝트이다. Chainsaw는 자바 기반의 GUI 뷰어이며, 풍부한 기능을 갖추고 있다. Log4j와 유사한 설정 파일을 사용한다. Log4j용 뷰어로는 log2web(오픈 소스 및 웹 기반) 등이 있지만, Chainsaw에 비해 기능이 적다.