물론이죠! 아래에 log4j의 개념과 구조를 초보자도 쉽게 이해할 수 있도록 정리된 표와 요약으로 구성해드릴게요.
✅ 1. log4j란?
- Java 기반의 오픈소스 로깅 프레임워크
- 개발 중 에러, 상태, 디버깅 메시지 등을 효과적으로 기록할 수 있음
- 콘솔, 파일, DB 등 다양한 위치에 로그를 남길 수 있음
✅ 2. log4j의 주요 구성요소
| 구성요소 | 역할 |
|---|
| Logger | 로그를 남길 주체. 로그 메시지를 Appender로 전달 |
| Appender | 로그를 저장할 위치를 지정 (콘솔, 파일, DB 등) |
| Layout | 로그의 출력 형식을 결정 (날짜, 메시지, 클래스명 등) |
✨ Layout 패턴 옵션 정리
| 패턴 | 설명 |
|---|
%d | 로그 발생 시간 |
%p | 로그 레벨 (INFO, DEBUG 등) |
%t | 로그를 발생시킨 스레드 이름 |
%c | 카테고리 (보통 클래스 이름) |
%F | 로그를 발생시킨 파일 이름 |
%L | 로그를 발생시킨 코드의 줄 번호 |
%C | 클래스 이름 (전체 경로 포함) |
%M | 메서드 이름 |
%m | 실제 메시지 |
%n | 줄바꿈 (개행문자) |
%l | %C.%M(%F:%L) 전체 정보 요약 |
✅ 3. log4j 로그 레벨 (중요도 순서)
| 레벨 | 설명 | 운영 시 사용 여부 |
|---|
| FATAL | 치명적인 오류, 시스템 종료 가능성 있음 | ○ |
| ERROR | 일반적인 에러 상황 | ○ |
| WARN | 경고 상황 (에러는 아님) | ○ |
| INFO | 상태 메시지, 일반 정보 | ◎ (운영 시 추천) |
| DEBUG | 상세한 디버깅 정보 | △ (개발 시에만) |
| TRACE | 가장 상세한 로그 | × (거의 사용 안 함) |
DEBUG 레벨로 설정하면: DEBUG 이상(FATAL까지) 모두 출력됨
INFO 레벨로 설정하면: INFO 이상(FATAL까지)만 출력됨
✅ 4. log4j 설정 예시
📁 설정 파일 위치
- 개발 (Eclipse):
src 폴더
- 배포 (Tomcat):
WEB-INF/classes 폴더
🔧 설정 예시: log4j.properties
log4j.rootLogger=INFO, Console, FileCompareAppender
# 콘솔에 출력
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%p] %c - %m%n
# 파일에 출력
log4j.appender.FileCompareAppender=org.apache.log4j.FileAppender
log4j.appender.FileCompareAppender.File=logs/mylog.log
log4j.appender.FileCompareAppender.Append=false
log4j.appender.FileCompareAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.FileCompareAppender.layout.ConversionPattern=%d [%p] %c %M:%L - %m%n
✅ 5. 로그를 위한 필수 라이브러리
| 라이브러리 이름 | 용도 |
|---|
log4j.jar | log4j 메인 라이브러리 |
commons-logging.jar | 다른 라이브러리와의 연결(Bridge 역할) |
✅ 부가 팁
| 목적 | 설정 방법 |
|---|
| 매번 새 로그 파일 생성 | log4j.appender.FileCompareAppender.Append=false |
| 특정 클래스에만 로그 적용 | log4j.category.클래스이름=INFO, Appender명 |
| 콘솔/파일 로그 동시 사용 | log4j.rootLogger=INFO, Console, FileAppender |
필요하다면 예제 코드나 설정파일 템플릿도 따로 정리해줄게요. 더 도와드릴까요? 😎