Log4j에 대한 학습 - Log4j 의 개념 및 Log4j2

Java 프로젝트를 진행하면서 가장 중요하다고 생각하는 로그 출력에 대한 라이브러리를 찾아보다가 최근 보안취약점으로 이슈가 되었던 Log4j가 보안 취약점을 보안한 Log4j2 라이브러리가 많이 사용되는것을 보고, Log4J에 대한 개념 및 사용법을 학습하여 여기에 기술한다.


Apache Log4J ( Log For Java ) 란?

소프트웨어가 가동되면 일련의 이벤트들을 일으키는데, 이런 이벤트들의 성공여부 혹은 실패여부부터 시작하여 사용자가 어디서 언제 어떤 이벤트를 어떻게 잃으켰는지 등의 모든 작업행위 등을 로그(Log)라고 부르며 로그를 남기는 행위를 로깅(Logging)이라고 부르고, 때문에 Java로 만들어진 프로그램의 로깅을 쉽게 도와주는 라이브러리가 Log4J ( Log For Java )다.

 

Java언어를 사용하여 프로그래밍된 프로그램의 로그를 기록해주는 라이브러리로써 Log4J 라이브러리를 사용한 프로그램을 실행할 때 Log4J의 설정값에 따른 경로에 설정한 특정 로그들을 로깅해주는 기능을 제공한다. 특히 Log4J는 무료로 공개된 오픈소스 라이브러리이기 때문에 많은 기업체 및 관공서, 정부기관에서 사용하고 있다.

Log4J 로고

Log4J의 보안 취약점

2021년 11월, 알리바바의 클라우드 보안팀에 의해 Log4J팀에 비공개로 처음 취약점이 전달되었으며 2021년 12월, 수 많은 사용자들을 유치하고 있는 비디오게임 '마인크레프트' 에서 Log4J의 취약점이 발견되며 대중에게 공개되었다. Java로 개발된 마인크래프트 특정 버전에서 특정 메시지를 입력하면, 대상 컴퓨터에서 원격으로 프로그램을 접속하여 서버 및 클라이언트의 권한을 취득하여 해킹이 가능한 Log4J의 취약점 (Log4Shell이라고 칭함)이 확인되었다. 처음 발견 당시 게임 플랫폼에서 사용자의 장난처럼 보였던 이 보안 취약점은 아마존 AWS, 클라우드플레어, 아이클라우드, 마인크레프트 자바 에디션, 스팀, 텐센트 QQ 등 오픈소스 라이브러리인 Log4J를 사용하여 개발된 모든 소프트웨어에서 영향을 미치는 것이 뒤늦게 발견되며 2021년에 엄청난 이슈가 되었다. 이러한 보안 취약점을 보안하며 발표된 것이 현재 많이 사용되는 Log4J2이다.

 

 

Log4Shell - 위키백과, 우리 모두의 백과사전

Log4Shell로그4셸CVE 식별자CVE-2021-44228발견일2021년 11월 24일 (5개월 전)(2021-11-24)패치일2021년 12월 6일 (5개월 전)(2021-12-06)발견자알리바바 클라우드 보안팀의 천자오쥔[1]영향을 받는 소프트웨어Log4j 2

ko.wikipedia.org

 

Apache Log4J2 ( Log For Java 2 )의 출현 과정 및 개선점

Apache Log4J2는 Log4J, java.util.logging을 포함한 기존 로깅 솔루션들의 영향을 받아 처음부터 재개발 되었다. 처음부터 재개발 된 이유는 Log4J의 보안 취약점 패치가 어려웠기 때문인데, 엄청난 수의 프로젝트에 패치를 적용해야 했던것이 문제였다. Log4J는 수 많은 프로젝트에서 사용되는 오픈소스 라이브리였고, 패치를 통합하기 위해서는 Log4J를 사용하는 모든 프로젝트를 업데이트 해야했기 때문이다. 또한 Log4J 라이브러리에 종속된 다른 라이브러리들에 대한 의존성 문제가 있었기 때문에 하나의 프로그램을 패치하는 것으로 끝나는 것이 아닌, 잠재적으로 수천개의 프로그램을 패치하는 것을 의미했기 때문에 처음부터 재개발 되는 형식으로 만들어졌다.

 

Log4J 1과 대비하여 주된 차이점 및 향상된 기능은 아래와 같다.

  • 개선된 가독성. Log4j 1이나 로그백과 같은 프레임워크를 재구성하는 동안 메시지는 소실되지 않음.
  • 확장성. Log4j 2는 플러그인 시스템을 지원하므로 사용자들이 사용자 지정 구성 요소를 정의하고 구성할 수 있음.
  • 단순화된 구성 문법
  • xml, json, yaml, properties 구성 지원
  • 개선된 필터
  • 구성 파일, 시스템 속성, 환경 변수, ThreadContext Map, 이벤트 내 데이터에 정의된 값의 속성 찾기 지원
  • 여러 API 지원: Log4j 2는 Log4j 2, Log4j 1.2, SLF4J, Commons Logging, java.util.logging (JUL) API를 사용하여 응용 프로그램과 함께 사용할 수 있음.
  • 사용자 지정 로그 레벨
  • 레이지 로깅(lazy logging)을 위한 자바 8 스타일의 람다 지원
  • 마커
  • 사용자 지정 메시지 오브젝트 지원
  • 공통 구성에서 가비지가 거의 없거나 아예 없음
  • 개선된 속도

Apache Log4J2의 기능 및 구성

Log4J2 의 최신 버전에 의하면 High Level ~ Low Level의 7개의 Log Level을 가지고 있다. 설정 파일에 대상별로 레벨 지정이 가능하고, 그 등급 이상의 로그만 저장하는 방식으로 로깅이 이루어진다. Log4J2는 사용자가 자신만의 로그 레벨을 정의할 수 있게 허용하는데, 내장된 아래의 7개의 로그 레벨과 동일한 사용자 지정 로그 레벨을 지원하는 Loggers를 만들기 위해 소스 코드 생성기 도구를 제공한다.

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

 

Log4J2는 구성 파일 또는 Java Code를 통해 구성할 수 있느느데 [XML, JSON, YAML, Properties File] 포맷으로 작성이 가능하다. 구성 내에서 사용자는 Loggers, Appenders, Layouts 3개의 주요 구성 요소를 정의할 수 있는데 파일을 통해 로깅을 구성할 경우 Log4J2를 사용하는 으용 프로그램을 수정하지 않더라도 로깅을 켜고 끌 수 있다는 장점이 있어서 Properties Files로 구성하는 것을 권장하는 추세이다. 응용 프로그램은 문제가 생길 때까지 로그를 끄도록 허용하는 것이 가능한데, 예를 들어 로깅을 되돌리거나 단순히 구성 파일을 수정하는 것만으로 가능하기 때문이다.

  • Loggers는 로그 메시지 도착지 이름이다.
  • Appenders는 실제 출력을 수행하는 실체이다.
  • Layouts는 Appenders가 로그 항목의 서식을 지정하기 위해 사용한다.
  • Filters는 Log4j 2의 기능으로, 어느 로그 항목이 어느 Loggers와 Appenders에 의해 처리되어야 하는지를 세밀히 조절하기 위한 것이다.