1. Common Logging이란.
Commons Loggin API는 자카르타 Commons에 포함되어 있는 프로젝트들이 로거로 사용하는 API이다. Commons Logging API는 자체적으로 로깅 기능을 구현하고 있지는 않으며, 로깅 요청을 Log4J나 자바1.4로깅 API와 같이 이미 존재하는 로깅 API에 전달하는 다리 역할을 한다. 즉, Commons Logging API를 사용하면 Log4J를 사용하든 자바 1.4의 로깅 API를 사용하든지에 상관없이 동일한 방식으로 로깅 코드를 작성할 수 있게 된다.
2. SLF4J란.
SLF4J는 commons-logging과 동일한 목적으로 활용되지만, static wiring을 사용해서 발생하는 클래스 로딩 문제를 해결한 버전이다. 해당 번들로는 slf4j-api-XXX.jar, jcl104-overslf4j-XXX.jar, slf4j-log4j-XXX.jar 등이 있다.
SLF4J의 장점 : Logging Message의 Format이 쉽다.
로깅파일 다운로드.
Commons Logging : http://commons.apache.org/downloads/download_logging.cgi
SLF4J : http://www.slf4j.org/
log4j : http://archive.apache.org/dist/logging/log4j/
JDBCAppender : http://dankomannhaupt.de/projects/index.html DB에 로그를 저장 하기위해서 jar파일을 추가해야한다.
로깅설정. (이클립스)
1. src/commons-logging.properties
- log4j를 설정.
(1)log4j사용 : org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
2. src/log4j.properties
- 로그레벨은 5가지로 구분된다.(DEBUG, INFO, WARN, ERROR, FATAL) DEBUG를 제외한 모든 로그를 기록한다.
- 로그 출력형태를 지정한다. console(화면출력), filelog(파일기록), dblog(DB기록)
log4j.rootLogger=INFO, console, filelog ,dblog
- 1line : console에 대한 클래스 정의
- 2line : 로그를 나타내기 위한 Layout클래스 정의
- 3line : Layout에 대한 ConversionPattern을 정의 (어떠한 포맷으로 로그를 기록할 것인가.)
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p,%d{yyyy/MM/dd HH:mm:ss.SSS},%-5X{APP}, %-
- 1 : filelog에 대한 클래스 정의 (로그 파일을 매일 새로운 파일로 생성.)
- 2 : 파일에 대한 Append 여부
- 3 : 파일을 Backup하기 위한 DatePattern을 정의
- 4 : 로그파일명을 지정.
- 5 : 로그형식을 HTML형식으로 지정.
log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.Append=true
log4j.appender.filelog.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.filelog.File=c:/logs/test.html
log4j.appender.filelog.layout=org.apache.log4j.HTMLayout
- 9 : DB를 Update하기 전까지 SQL문의 Buffer 개수. 1이면 바로 Update 함
- 10 : commit 여부
- 11 : single quotes (')를 2 single quotes ('')로 변경 여부
- 12 : throwable/exception stack trace의 최대 문자 개수 정의
log4j.appender.dblog=org.apache.log4j.jdbcplus.JDBCAppender
log4j.appender.dblog.url=jdbc:mysql://localhost:3306/example
log4j.appender.dblog.dbclass=com.mysql.jdbc.Driver
log4j.appender.dblog.username=root
log4j.appender.dblog.password=xxxxxxxxxxxx
log4j.appender.dblog.sql=INSERT INTO APP_LOG( SYSTEMNAME, LOGDATE, LOGLEVEL, MDC1,MDC2, MESSAGE, TROWABLE ) values ('MCSMGR',TIMESTAMP '@TIMESTAMP@','@PRIO@','@MDC:APP@','@MDC:TSC@','@MSG@','@THROWABLE@')
log4j.appender.dblog.layout=org.apache.log4j.PatternLayout
log4j.appender.dblog.layout.ConversionPattern=%m
log4j.appender.dblog.buffer=1
log4j.appender.dblog.commit=true
log4j.appender.dblog.quoteReplace=true
log4j.appender.dblog.throwableMaxChars=3000
dblog를 설정하기 위해 다음의 테이블을 생성한다.
CREATE TABLE APP_LOG
(
SYSTEMNAME VARCHAR(100),
LOGDATE TIMESTAMP,
LOGLEVEL VARCHAR(100),
MDC1 VARCHAR(100),
MDC2 VARCHAR(100),
MESSAGE VARCHAR(4000),
TROWABLE VARCHAR(4000)
)
3. src/Trace.java
import! org.apache.log4j.Level;
import! org.apache.log4j.Logger;
import! org.apache.log4j.MDC;
import! org.apache.log4j.PropertyConfigurator;
public class Trace{
private static Logger McsLogger = Logger.getRootLogger();
public static void log( Level level, String app, String tsc, String message){
log(level,app,tsc,message, null );
}
public static void log( Level level, String app, String tsc, String message, Throwable t){
if( tsc == null ) tsc = "";
if( app == null ) app = "";
MDC.put("APP",app);
MDC.put("TSC", tsc );
McsLogger.log( level, message, t );
MDC.remove("APP");
MDC.remove("TSC");
}
public static void main(String args[]){
String Path = System.getProperty( "user.dir" );
PropertyConfigurator.configureAndWatch( Path +"/config/log4j.properties", 1000);
System.out.println("URL:"+ Path +"/config/log4j.properties" );
Trace.log( Level.INFO, "APP1","TQFRP01","Message01");
Trace.log( Level.WARN, "APP2","TQFRP05","Message02");
Trace.log( Level.FATAL, "APP3","TQFRP01","Message03", new Exception("Deaded!!"));
System.out.println("TEST COMPLETED !!");
}
}
마지막으로 포맷지정 방법.
형식 | 설명 |
%p | debug, info, warn, error, fatal 등의 priority 가 출력된다. |
%m | 로그내용이 출력됩니다 |
%d | 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다 |
%t | 로그이벤트가 발생된 쓰레드의 이름을 출력합니다. |
%% | % 표시를 출력하기 위해 사용한다. |
%n | 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다. |
%c | 카테고리를 표시합니다 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다. |
%C | 클래스명을 포시합니다. 예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다 |
%F | 로깅이 발생한 프로그램 파일명을 나타냅니다. |
%l | 로깅이 발생한 caller의 정보를 나타냅니다 |
%L | 로깅이 발생한 caller의 라인수를 나타냅니다 |
%M | 로깅이 발생한 method 이름을 나타냅니다. |
%r | 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) |
%x | 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다. |
%X | 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. |
[출처] 1. Common Logging (자바를 통하여 세계로) |작성자 세피룸
p.s
%-5p, %5p와 같이 형식앞에 음수 또는 양수값을 붙이면 해당 숫자만큼 스페이스가 생긴다.
음수값 : %-5p%m와 같이 했을경우 로그레벨이 나오고 5칸 공간이 생긴다.
양수값 : %5p%m와 같이 했을경우 5칸의 공간이 생기고 로그레벨이 나오고 그뒤에 바로 내용이 출력된다.