log4j란
log4j는 로그를 자동으로 출력해 주는 오픈소스 라이브러리입니다.
출력하고자 하는 log를 "콘솔", "로그 파일", "DB 로그" 등으로 남길 수 있습니다.
log4j 링크
오픈소스 링크 : logging.apache.org/log4j/1.2/
Maven을 사용하시는 분들은 아래의 링크를 통해 받을 필요가 없습니다.
다운로드 링크 : logging.apache.org/log4j/1.2/download.html
log4j 사용법 (console, log file)
1. Maven 프로젝트에 log4j를 pom.xml에 dependency 추가
Maven 프로젝트로 log4j를 사용하는 방법을 알려드리겠습니다.
먼저 Maven 프로젝트에 log4j를 dependency 추가합니다.
[pom.xml]
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
위의 xml 내용은 mvnrepository에 log4j를 검색해서 나오는 Apache Log4j의 최신버전 입니다.
그냥 pom.xml에 dependencies 안에 위의 내용을 붙여 넣어서 사용할 라이브러리라고 선언해줍니다.
mvnrepository.com/artifact/log4j/log4j/1.2.17
2. log4j.properties 설정
xml로 설정파일을 작성하시는 것을 권장하지만 properties를 이용하여 작성해 보겠습니다.
src/main/resource 디렉터리 안에 "log4j.properties"를 추가합니다.
그리고 아래와 같은 내용을 붙여 넣습니다.
이해를 돕기 위한 주석이 포함된 코드
# rootLogger
# Logger Level(Fatal > Error > Warning > Info > Debug > Trace), 객체명, 객체명
log4j.rootLogger=DEBUG, consoleAppender, fileAppender, sql
# rootLogger 에서 정의한 객체에 타입과 기능을 정의
# log4j.appender.consoleAppender => Console에 출력해주는 객체
# org.apache.log4j.ConsoleAppender : 콘솔애 출력해 주겠다.
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold=All
# layout : console에 출력을 할 때 ConversionPattern 형태로 출력을 해준다.
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
# log4j.appender.consoleAppender.layout.ConversionPattern=[%t] %-5p %c %x - %m%n
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n
# log4j.appender.fileAppender => 파일로 저장하겠다.
# org.apache.log4j.RollingFileAppender 하루에 한번씩 파일을 생성해서 로그를 저장해 주겠다.
log4j.appender.fileAppender=org.apache.log4j.DailyRollingFileAppender
# File : 파일의 위치가 어디고 어떠한 파일을 명으로 생성하겠다.
# log4j.appender.fileAppender.File=demoApplication.log
log4j.appender.fileAppender.File=c:/log/log4j.log
# 하루가 지난 파일은 goodee.log에서 goodee.2021-04-12 이렇게 바꾸겠다.
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=[%t] %-5p %c %x - %m%n
log4j.appender.fileAppender.layout.ConversionPattern=[%d] [%-5p] [%13F\:%L] - %m%n
주석이 없는 코드
log4j.rootLogger=DEBUG, consoleAppender, fileAppender, sql
log4j.appender.consoleAppender=org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.Threshold=All
log4j.appender.consoleAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n
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
3. 로그 출력하기
테스트로 log4j를 이용한 로그를 출력해 봅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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 으로 설정한대로 로그가 출력되어 나온다.
public void userLogger() {
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
logger.fatal("fatal");
}
}
|
cs |
다음과 같이 userLogger를 출력해 본다.
1
2
|
Log4j_Test log = new Log4j_Test();
log.userLogger();
|
cs |
위의 userLogger 코드에서 Log4j 레벨을 볼 수 있습니다.
Log4j 레벨
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
4. 결과
1. 콘솔 출력
위의 결과처럼 로그가 나오는 것은 "log4j.properties" 설정에 따라 위와 같은 모양이 나옵니다.
log4j.appender.consoleAppender.layout.ConversionPattern=[%d] [%-5p] %c %x - %m%n
Conversion 패턴입니다.
- [%d] : 날짜와 시간입니다.
- [%-5p] : 5자리 글자 고정으로 디버그 레벨을 나타냅니다.
- %c : 카테고리가 출력이 됩니다.
- %x : 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context) 출력됩니다.
- %m : 로그 내용이 출력됩니다.
- %n : 개행문자 입니다.
위와 같은 패턴 옵션은 여러가지 있습니다. 다음 링크를 통해서 상세한 내용을 보실 수 있습니다.
출처 : cofs.tistory.com/354
2. 파일 출력
log4j.appender.fileAppender.File=c:/log/log4j.log
log4j는 log파일로 출력이 가능합니다.
위의 경로로 통해서 파일에 잘 출력이 되었나 확인해 봅니다.
로그 파일에 잘 출력이 된 모습을 볼 수 있습니다.
log4j 사용법 (DataBase)
JDBCAppender를 사용하여 데이터베이스에 log를 저장하는 방법입니다.
1. log4j.properties 설정
log4j.properties에 아래의 내용을 더 추가합니다.
# 위에 선언된 객체인 sql에 JDBC에 저장할 수 있는 JDBCAppender를 연결한다
log4j.appender.sql=org.apache.log4j.jdbc.JDBCAppender
# 선언된 객체에 필요한 접속 정보 (driver, url, user, password)를 입력 한다
log4j.appender.sql.URL=[데이터베이스 URL]
log4j.appender.sql.driver=[드라이버]
log4j.appender.sql.user=[유저네임]
log4j.appender.sql.password=[패스워드]
# 테이블에 insert하는 쿼리를 작성한다
log4j.appender.sql.sql=INSERT INTO LOGS VALUES ('%x', SYSDATE ,'%C','%p','%m')
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
주의 : 위의 설정의 중간쯤 보시면 접속정보를 적는 부분이 있습니다.
접속정보를 꼭 자신의 DB환경에 맞게 입력해 주시기 바랍니다.
[ ]도 지우시고 입력하셔야 합니다.
# 예시
log4j.appender.sql.URL=jdbc:mysql://localhost/test
log4j.appender.sql.driver=com.mysql.jdbc.Driver
log4j.appender.sql.user=root
log4j.appender.sql.password=password
아래 부분의 SYSDATE는 Oracle DB 기준입니다.
mysql을 사용하시는 분은 now() 를 사용하셔서 차질이 없기 바랍니다.
# 테이블에 insert하는 쿼리를 작성한다
log4j.appender.sql.sql=INSERT INTO LOGS VALUES ('%x', SYSDATE ,'%C','%p','%m')
log4j.appender.sql.layout=org.apache.log4j.PatternLayout
2. 테이블 추가
MySQL
CREATE TABLE LOGS
(
USER_ID VARCHAR(20),
DATED DATETIME NOT NULL,
LOGGER VARCHAR(50) NOT NULL,
LEVEL VARCHAR(10) NOT NULL,
MESSAGE VARCHAR(1000) NOT NULL
);
Oracle
CREATE TABLE "LOGS" (
"USER_ID" VARCHAR2(20),
"DATED" DATE NOT NULL,
"LOGGER" VARCHAR2(50) NOT NULL,
"LEVEL" VARCHAR2(10) NOT NULL,
"MESSAGE" VARCHAR2(1000) NOT NULL
);
위의 쿼리를 통해 테이블을 추가합니다.
3. 출력 및 결과
위의 Log4j_Test를 통해서 로그를 출력하면 자연스럽게 DB Table에 로그가 생기는것을 볼 수 있습니다.
Log4j 세부 내용
아래 내용의 출처는 cofs.tistory.com/354에 있습니다.
Log4j 구조
Logger(Category)
로깅 메세지를 Appender에 전달
log4J의 심장부에 위치
개발자가 직접 로그출력 여부를 런타임에 조정
logger는 로그레벨을 가지고 있으며, 로그의 출력 여부는 로그문의 레벨과 로거의 레벨을 가지고 결정
Appender
로그의 출력위치를 결정(파일, 콘솔, DB 등)
log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 어느정도 짐작가능
Layout
Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지 출력 layout을 결정
Log4j 레벨
FATAL
아주 심각한 에러가 발생한 상태. 시스템적으로 심각한 문제가 발생해서 어플리케이션작동이 불가능할 경우가 해당하는데, 일반적으로는 어플리케이션에서는 사용할 일이 없음
ERROR
요청을 처리하는 중 문제가 발생한 상태를 나타냄
WARN
처리 가능한 문제이지만, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄
INFO
로그인, 상태변경과 같은 정보성 메시지를 나타냄
DEBUG
개발시 디버그 용도로 사용한 메시지를 나타냄
TRACE
log4j1.2.12에서 신규 추가된 레벨로서,
DEBUG 레벨이 너무 광범위한 것을 해결하기 위해서 좀 더 상세한 상태를 나타냄
Log4j Pattern Option
%p
debug, info, warn, error, fatal 등의 priority 출력
%m
로그내용 출력
%d
로깅 이벤트가 발생한 시간을 출력
ex)포맷은 %d{HH:mm:ss} 같은 형태의 SimpleDateFormat
%t
로그이벤트가 발생된 쓰레드의 이름 출력
%F
로깅이 발생한 프로그램 파일명 출력
%l
로깅이 발생한 caller의 정보 출력
%L
로깅이 발생한 caller의 라인수 출력
%M
로깅이 발생한 method 이름 출력
%
% 표시 출력
%n
플랫폼 종속적인 개행문자 출력
%c
카테고리 출력
ex)카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c 출력
%C
클래스명 출력
ex)클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 출력
%r
어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) 출력
%x
로깅이 발생한 thread와 관련된 NDC(nested diagnostic context) 출력
%X
로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context) 출력
Log4j 주요 클래스
ConsoleAppender
org.apache.log4j.ConsoleAppender
콘솔에 로그 메시지 출력
FileAppender
org.apache.log4j.FileAppender
파일에 로그 메시지 기록
RollingFileAppender
org.apache.log4j.rolling.RollingFileAppender
파일 크기가 일정 수준 이상이 되면 기존 파일을 백업파일로 바꾸고 처음부터 기록
DailyRollingFileAppender
org.apache.log4j.DailyRollingFileAppender
일정 기간 단위로 로그 파일을 생성하고 기록
JDBCAppender
org.apache.log4j.jdbc.JDBCAppender
DB에 로그를 출력. 하위에 Driver, URL, User, Password, Sql과 같은 parameter를 정의할 수 있음
SMTPAppender
로그 메시지를 이메일로 전송
NTEventAppender
윈도우 시스템 이벤트 로그로 메시지 전송
전자정부 확장 Appender
www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte:fdl:logging
참조
'개발 아카이브 > JAVA' 카테고리의 다른 글
[myBatis] mybatiseditor - SQL Mapper DTD 설치 (1) | 2021.04.15 |
---|---|
[MAVEN] m2e 문제 - cannot nest inside to enable the nesting exclude (1) | 2021.04.13 |
[자바] 리터럴 literal (0) | 2021.03.11 |
[자바] 타입 Type 개념 (0) | 2021.03.11 |
[자바] 이클립스를 이용해 JAVA API 문서 만들기 (0) | 2021.02.24 |