Log4j 란?
Log란 컴퓨터가 언제, 무슨 일을, 어떻게 했는지 남겨 놓은 기록으로, Log4j는 JAVA를 사용하여 Log를 남기는 도구입니다.
Log4j는 자바 기반의 로깅 유틸리티로 Apache에서 만든 오픈소스 라이브러리입니다.
프로그램은 유지와 관리를 위해서 기록을 남기기 때문에 Log4j는 거의 전 세계 대부분의 JAVA 기반 서버와 응용 프로그램에서 사용하고 있습니다.
Log4j는 옵션 설정을 통해서 선택적으로 로그를 남기거나 특정 파일에 로그를 생성하는 등 다양한 이점을 가지고 있습니다.
Log4j 레벨
로그 레벨 | 설명 |
FATAL | 아주 심각한 에러가 발생한 상태를 나타냄 |
ERROR | 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타냄 |
WARN | 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될수있는 경고성 메시지를 나타냄 |
INFO | 어떠한 상태변경과 같은 정보성 메시지를 나타냄 |
DEBUG | 개발시 디버그 용도로 사용하는 메시지를 나타냄 |
TRACE | 디버그 레벨이 너무 광범위한것을 해결하기 위해 좀 더 상세한 이벤트를 나타냄 |
FATAL > ERROR > WARN > INFO > DEBUG > TRACE 순서대로 레벨의 차이가 있으며, 출력 레벨 설정에 따라 설정 레벨 이상의 로그가 출력됩니다. 예를 들어 출력 레벨을 INFO라고 설정했다면, INFO를 포함하고 INFO보다 높은 레벨인 WARN, ERROR, FATAL이 출력됩니다.
Log4j 구성 요소
요소 | 설명 |
Logger | 출력할 메시지를 Appender에 전달 |
Appender | 전달된 로그를 어디에 출력할지 결정(콘솔 출력, 파일 기록, DB 저장 등) |
Layout | 로그를 어떤 형식으로 출력할지 결정 |
Logger는 실제 로그 기능을 수행하는 객체로 Name을 가지고 사용됩니다. 로그 레벨을 설정할 수 있고, 0개 이상의 Appender를 지정할 수 있습니다. 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달됩니다.
기본적으로 최상위 logger인 Root logger을 설정해 주어야 합니다.
요소 | 설명 |
jdbc.sqlonly | SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여짐 |
jdbc.sqltiming | SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함 |
jdbc.audit | ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음 |
jdbc.resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성 |
Appender는 로그를 출력할 위치, 출력 형식 등을 지정할 수 있습니다. 아래 표의 4개 말고도 SMTPAppender, DBAppender 등이 있는데, 이걸 이용하면 로그를 원격 위치에 기록할 수도 있습니다. 그리고 주의해야 할 것이 있는데, Appender태그는 Logger태그들보다 위에 있어야 합니다.
요소 | 설명 |
ConsoleAppender | org.apache.log4j.ConsoleAppender 콘솔에 로그 메시지를 출력 |
FilerAppender | org.apache.log4j.FilerAppender 로그 메시지를 지정된 파일에 기록 |
RollingFileAppender | org.apache.log4j.RollingFileAppender 파일 크기가 일정 수준 이상이 되면 기존 파일을 백업파일로 두고 처음부터 다시 기록 |
DailyRollingFilerAppender | org.apache.log4j.Daily.Rolling.File.Appender 일정 기간 단위로 로그 파일을 생성하고 기록 |
LayOut은 로그를 출력하는 형태를 만들 수 있습니다. PatternLayout을 이용하는 게 가장 적합한데, 로그의 출력 형태, Layout을 자신이 원하는 형식으로 바꿀 수 있습니다. 아래 표의 붉은 표시는 성능에 영향을 줍니다.
패턴 | 설명 |
%m | 로그 내용 출력 |
%p | debug, info, warn, error 등의 priority 출력 |
%r | 어플리케이션 시작 후 이벤트가 발생하는 시점까지의 경과시간. (밀리세컨드로 출력) |
%c | package 출력 |
%C | 클래스명 출력 |
%d | 이벤트 발생 날짜 출력 |
%n | 개행문자(\n) 출력 |
%M | 로깅이 발생한 method 이름 출력 |
%F | 로깅이 발생한 프로그램 파일명 출력 |
%l | 로깅이 발생한 caller 정보 출력 |
%L | 로깅이 발생한 caller 라인수 출력 |
%x | 로깅이 발생한 thread와 관련된 NDC 출력 |
%X | 로깅이 발생한 thread와 관련된 MDC 출력 |
% | % 출력 표시 |
%t | 쓰레드 이름 출력 |
logger에 대해서 추가로 설명하자면, 아래 표에서 Additivity는 상위 Logger로부터의 상속 여부를 의미합니다.
True(기본값) 일 경우, 먼저 모든 상위 로거들의 설정값을 상속받아 현재 로거에 설정된 값을 재적용(덮어쓰기) 시키며, False로 설정하게 된다면 해당 로거는 상위 로거의 설정 내용을 상속받지 않습니다.
즉, Vehicle의 경우 Root 로거로부터 DEBUG 레벨 설정을 상속받지만 현재 로거에 INFO 레벨이 적용되어 있기 때문에 최종적으로 INFO 레벨이 적용되며, Root 로거의 Console Appender와 Vehicle 로거의 RollingFile Appender 모두에게 로그 메시지를 전달하게 됩니다.
Vehicle.Car의 경우 Additivity 값이 false 이기 때문에 상위 로거인 Root, Vehicle 로거로부터 설정을 상속받지 않아 최종적으로 ERROR 레벨 이상의 로그가 File Appender로 전달되게 됩니다.
만일 Logger 설정되지 않은 클래스명( ex – Vehicle.Airplane)이 입력되었을 경우, 상위 로거인 Vehicle의 설정 내용으로 동일하게 적용됩니다.
Logger Name | Level | Appender | Additivity |
Root | DEBUG | Console | |
Vehicle | INFO | RollingFile | ture |
Vehicle.Car | ERROR | Filer | false |
Log4j 설정 하기(Maven 기준)
1. pom.xml에 log4j dependency추가
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. log4j.properties 설정
properties파일을 이용한 방법입니다.
src/main/resource 디렉터리 안에 "log4j.properties" 파일을 추가합니다.
아래와 같이 내용을 입력합니다.
# 1
log4j.rootLogger=DEBUG, consoleAppender, fileAppender, sql
# 2
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold=All
# 3
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n
# 4
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
log4j.appender.fileAppender.File=c:/log/log4j.log
# 5
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
# 1
Logger Level(Fatal > Error > Warning > Info > Debug > Trace), 객체명, 객체명을 입력
# 2
rootLogger에서 정의한 객체에 타입과 기능을 정의하는 라인입니다.
log4j.appender.consoleAppender 는 Console에 출력해주는 객체를 말하며,
org.apache.log4j.ConsoleAppender 는 콘솔에 출력해 주겠다는 라인입니다.
# 3
console에 출력을 할 때 ConversionPattern 형태로 출력을 해준다라는 의미입니다.
log4j.appender.consoleAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n
# 4
log4j.appender.fileAppender 는 파일로 저장을 의미하며, org.apache.log4j.RollingFileAppender는 하루에 한 번씩 파일을 생성해서 로그를 저장해 주겠다는 의미입니다.
log4j.appender.fileAppender.File=c:/log/log4j.log 라인은 파일의 위치와 파일의 네이밍을 설정하는 부분입니다.
# 5
log4j.appender.fileAppender.DatePattern='.'yyyy-MM-dd
log4j.appender.fileAppender.Threshold=All
log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout
라인은 하루가 지난 파일은 log4j.log에서 log4j.2022-09-06의 형태로 바꾸겠다는 의미입니다.
3. 로그 출력
log4j를 이용하여 테스트 로그를 출력하는 과정입니다.
import org.apache.log4j.Logger;
public class Log4j_Test {
// log4j의 설정은 log4j.properties / log4j.xml 설정으로 한다.
// Argument로 출력이 될 객체의 Class(클래스명)를 선택함으로서 로그를 선별적으로 출력할 수 있다.
private Logger logger = Logger.getLogger(Log4j_Test.class);
// 출력이 될 객체의 클래스를 선택한 logger 객체를 생성하여 각 레벨의 로그를 출력한다.
// log4j.properties / log4j.xml 으로 설정한대로 로그가 출력되어 나온다.
// log4 레벨 : FATAL > ERROR > WARN > INFO > DEBUG > TRACE
public void userLogger() {
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
logger.fatal("fatal");
}
}
다음과 같이 userLogger를 통해 로그를 출력해볼 수 있습니다.
Log4j_Test log = new Log4j_Test();
log.userLogger();
'JAVA' 카테고리의 다른 글
[JAVA] 반복문의 제어(break, continue) (2) | 2022.11.04 |
---|---|
[Spring] @RequestBody, @ResponseBody의 사용 (2) | 2022.10.06 |
[JAVA] 날짜 비교하기(Date, Calendar, LocalDate, LocalDateTime) (3) | 2022.06.13 |
[JAVA] Get 방식과 Post 방식 (2) | 2022.06.03 |
[JAVA] 현재 날짜, 시간 구하기 (2) | 2022.05.03 |
댓글