2013. 4. 16. 09:46ㆍ99. 정리전 - IT/11. Java
출처 : 내가 좋아하는 JakartaProject.com 입니다
☞ LOG4J ☜ 두둥~
또다른자료 : 로그개념.txt
log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.
로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.
성능또한 우수해 더이상 System.out.println을 사용할 필요가 없습니다.
II. 다운로드
다운로드 |
|
매뉴얼 |
|
API spec |
III. LOG4J 구조
일단 log4j를 잘 모르지만 그 구조만 살짝 살펴보고 넘어갑시다
log4j는 크게 3가지 요소로 구성되며 그 구조는 다음과 같습니다
① Logger(Category) | 로깅 메세지를 Appender에 전달합니다. |
② Appender |
전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지 아니면 DB에 저장할 것인지 매개체 역활을 합니다. |
③ Layout |
Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지 출력 layout을 결졍합니다. |
IV. LOG4J 로깅 레벨
log4j는 다양한 로깅레벨을 지원합니다.
로그양적음 | | || ||| |||| ||||| |||||| 로그양 대따많음 |
① FATAL | 가장 크리티컬한 에러가 일어 났을 때 사용합니다. |
만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다. 즉 WARN, ERROR, FATAL 의 로깅이 됩니다. |
② ERROR | 일반 에러가 일어 났을 때 사용합니다. | ||
③ WARN | 에러는 아니지만 주의할 필요가 있을 때 사용합니다. | ||
④ INFO | 일반 정보를 나타낼 때 사용합니다. | ||
⑤ DEBUG | 일반 정보를 상세히 나타낼 때 사용합니다. |
V. 샘플코드 1
jsp에서 사용하는 예제가 없어 만들어 봤습니다.
test.jsp
<%@ page contentType="text/html;charset=MS949" import="org.apache.log4j.Logger" %> <%! <% logger.fatal("fatal2!!", new NullPointerException("널입니다요")); logger.error("error!", new NumberFormatException()); logger.error("error!2"); logger.warn("warn"); logger.info("info"); logger.debug("debug");
|
결과 콘솔화면
① static Logger logger = Logger.getLogger("test.jsp");
static 메소드 getLogger를 통해 logger 인스턴스를 가져옵니다.
getLogger에는 파라미터로 스트링 혹은 클래스를 사용하는데
jsp에서는 클래스를 파라미터로 주기에는 좀 애매합니다. 그냥 스트링으로 주도록 하지요
② logger.fatal("fatal!!");
logger.fatal("fatal2!!", new NullPointerException("널입니다요"));
logger에 fatal 레벨의 메세지를 전달합니다. 다음 두가지 메소드를 지원하는군요
fatal(Object message)
fatal(Object message, Throwable t)
각 레벨마다 위처럼 두가지 메소드를 지원합니다.
지원 메쏘드 | |
logger.fatal(Object message) |
logger.fatal(Object message, Throwable t) |
logger.error(Object message) |
logger.error(Object message, Throwable t) |
logger.warn(Object message) |
logger.warn(Object message, Throwable t) |
logger.info(Object message) |
logger.info(Object message, Throwable t) |
logger.debug(Object message) |
logger.debug(Object message, Throwable t) |
VI. 샘플코드 2
서블릿의 경우 다음과 같이 코딩하면 되겠군요
TestServlet.java import javax.servlet.*; public class TestServlet extends HttpServlet { static Logger logger = Logger.getLogger(TestServlet.class); public void init(ServletConfig config) throws ServletException { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { logger.info("Hellow World~"); ... } catch (Exception e) { |
VII. LOG4J 설정
log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다.
① 프로그램에서 설정
<%@ page contentType="text/html;charset=MS949" import="org.apache.log4j.*,java.io.* " <%! <% PatternLayout patternlayout = new PatternLayout(layout); = new DailyRollingFileAppender(patternlayout, logfilename, datePattern); |
② property 파일에 설정
① log4j.rootLogger=INFO, stdout, rolling ② log4j.appender.stdout=org.apache.log4j.ConsoleAppender ③ log4j.appender.stdout.layout=org.apache.log4j.PatternLayout ④ log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n ⑤ log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender or log4j.appender.rolling=org.apache.log4j.RollingFileAppender (추천) ⑥ log4j.appender.rolling.File=D:\\Web Source\\dev.DonzBox.com\\log\\output.log or log4j.appender.rolling.File=D:\\WWW\\dev.DonzBox.com\\log\\dev.DonzBox.log ⑦ log4j.appender.rolling.Append=true ⑧ log4j.appender.rolling.MaxFileSize=100KB ⑨ log4j.appender.rolling.layout=org.apache.log4j.PatternLayout ⑩ log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n ⑪ log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
|
① 최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의
log4j.rootLogger=INFO, stdout, rolling
② stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
③ stdout 어펜더는 patternlayout을 사용하겠다는 정의
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
④ 페턴은 다음과 같이 포맷팅 하겠다는 것을 정의
log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
⑤ 역시나 rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender (비추)
or
log4j.appender.rolling=org.apache.log4j.RollingFileAppender (추천)
⑥ 로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log
or
log4j.appender.rolling.File=D:\\WWW\\dev.DonzBox.com\\log\\dev.DonzBox.log
⑦ true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true
⑧ 파일 최대 사이즈는 500KB로 설정
⑨ 역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
⑩ rolling 어펜더는 패턴 레이아웃 포맷
log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
⑪ 하루가 지나면 아래의 형식으로 로그파일 이름이 변경됨
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
VIII. 설정 포맷
① 로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.
형식 |
설명 |
'.'yyyy-MM |
매달 첫번째날에 로그파일을 변경합니다 |
'.'yyyy-ww |
매주의 시작시 로그파일을 변경합니다. |
'.'yyyy-MM-dd |
매일 |
'.'yyyy-MM-dd-a |
|
'.'yyyy-MM-dd-HH |
매 시간의 시작마다 로그파일을 변경합니다. |
'.'yyyy-MM-dd-HH-mm |
매분마다 로그파일을 변경합니다. |
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며
PatternLayout이 일반적으로 가장 많이 쓰입니다.
형식 |
설 명 |
%p |
debug, info, warn, error, fatal 등의 priority 가 출력된다. |
%m |
로그내용이 출력됩니다 |
%d |
로깅 이벤트가 발생한 시간을 기록합니다. |
%t |
로그이벤트가 발생된 쓰레드의 이름을 출력합니다. |
%% |
% 표시를 출력하기 위해 사용한다. |
%n |
플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다. |
%c |
카테고리를 표시합니다 |
%C |
클래스명을 포시합니다. |
%F |
로깅이 발생한 프로그램 파일명을 나타냅니다. |
%l |
로깅이 발생한 caller의 정보를 나타냅니다 |
%L |
로깅이 발생한 caller의 라인수를 나타냅니다 |
%M |
로깅이 발생한 method 이름을 나타냅니다. |
%r |
어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) |
%x |
로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다. |
%X |
로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. |
예시) (같은 색끼리 보시면 됩니다)
위의 test.jsp를 다음 포맷으로 출력해본다면
[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다
[test.jsp] [org.apache.jsp.test_jsp] [
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
LOG4J 설정 예제 (내꺼)
# +------------------------------------------------------------
# | set the level of the root logger to DEBUG (the lowest level)
# | ( level : ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF )
# | and set its appenders named DEBUG and CONSOLE
# +------------------------------------------------------------
log4j.rootLogger=DEBUG, CONSOLE1, DAILY1
# +------------------------------------------------------------
# | SQL Map logging configuration
# +------------------------------------------------------------
log4j.logger.com.ibatis=DEBUG, CONSOLE1
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.cache.CacheModel=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientImpl=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.builder.xml.SqlMapParser=DEBUG
log4j.logger.com.ibatis.common.util.StopWatch=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
# +------------------------------------------------------------
# | TYPE 01. set the appender CONSOLE
# +------------------------------------------------------------
log4j.appender.CONSOLE1=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE2=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE3=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE4=org.apache.log4j.ConsoleAppender
# +------------------------------------------------------------
# | TYPE 02. set the appender FILE (no use)
# +------------------------------------------------------------
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.Append=true
#log4j.appender.FILE.file=C:/SLP/eclipse/workspace/logs/slp2/slp_control.log
log4j.appender.FILE.file=/APP/log/slp/slp_control.log
# +------------------------------------------------------------
# | TYPE 03. set the appender ROLLING (no use)
# +------------------------------------------------------------
log4j.appender.ROLLING=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING.Append=true
#log4j.appender.ROLLING.file=C:/SLP/eclipse/workspace/logs/slp2/slp_control.log
log4j.appender.ROLLING.file=/APP/log/slp/slp_control.log
log4j.appender.ROLLING.MaxFileSize=1KB
# +------------------------------------------------------------
# | TYPE 04. set the appender DAILY
# +------------------------------------------------------------
log4j.appender.DAILY1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY1.Append=true
log4j.appender.DAILY1.file=C:/SLP/eclipse/workspace/logs/slp2/slp_control.log
#log4j.appender.DAILY1.file=/APP/log/slp/slp_control.log
log4j.appender.DAILY1.DatePattern='_'yyyy-MM-dd'.log'
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
log4j.appender.DAILY2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DAILY2.Append=true
log4j.appender.DAILY2.File=C:/SLP/eclipse/workspace/logs/slp2/slp_schedule.log
#log4j.appender.DAILY2.File=/APP/log/slp/slp_schedule.log
log4j.appender.DAILY2.DatePattern='_'yyyy-MM-dd'.log'
# +------------------------------------------------------------
# | setting the layout for the Threshold
# +------------------------------------------------------------
log4j.appender.CONSOLE1.Threshold=DEBUG
log4j.appender.CONSOLE2.Threshold=DEBUG
log4j.appender.CONSOLE3.Threshold=DEBUG
log4j.appender.CONSOLE4.Threshold=DEBUG
log4j.appender.FILE.Threshold=ERROR
log4j.appender.ROLLING.Threshold=ERROR
log4j.appender.DAILY1.Threshold=ERROR
log4j.appender.DAILY2.Threshold=ERROR
# +------------------------------------------------------------
# | setting the immediate flush to true(default)
# +------------------------------------------------------------
log4j.appender.CONSOLE1.ImmediateFlush=true
log4j.appender.CONSOLE2.ImmediateFlush=true
log4j.appender.CONSOLE3.ImmediateFlush=true
log4j.appender.CONSOLE4.ImmediateFlush=true
log4j.appender.FILE.ImmediateFlush=true
log4j.appender.ROLLING.ImmediateFlush=true
log4j.appender.DAILY1.ImmediateFlush=true
log4j.appender.DAILY2.ImmediateFlush=true
# +------------------------------------------------------------
# | setting the layout for the Patterns
# +------------------------------------------------------------
log4j.appender.CONSOLE1.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE2.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE3.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE4.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY1.layout=org.apache.log4j.PatternLayout
log4j.appender.DAILY2.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE1.layout.ConversionPattern=[%-5p] [%c] - %m%n
log4j.appender.CONSOLE2.layout.ConversionPattern=[%-5p] [%c] - %m%n
log4j.appender.CONSOLE3.layout.ConversionPattern=[%-5p] [%c] - %m%n
log4j.appender.CONSOLE4.layout.ConversionPattern=[%-5p] [%c] - %m%n
log4j.appender.DAILY1.layout.ConversionPattern=%d{HH:mm:ss} %-5p %t %rms %-c:%L %m%n
log4j.appender.DAILY2.layout.ConversionPattern=%d{HH:mm:ss} %-5p %t %rms %-c:%L %m%n
# +------------------------------------------------------------
# | setting the Mapping
# +------------------------------------------------------------
log4j.logger.aof=DEBUG, CONSOLE1
log4j.additivity.aof=false
log4j.logger.org.apache.struts=DEBUG, CONSOLE2
log4j.additivity.org.apache.struts=false
log4j.logger.org.apache.struts.taglib.tiles=DEBUG, CONSOLE3
log4j.additivity.org.apache.struts.taglib.tiles=false
log4j.logger.com.fcsoft=DEBUG, CONSOLE4
log4j.additivity.com.fcsoft=false
log4j.logger.com.fcsoft.lms.adm.se.Model=ERROR, DAILY2
log4j.additivity.com.fcsoft.lms.adm.se.Model=false
LOG4J 설정 예제 (http://blog.naver.com/seogi1004)
# Log4j Setting file(DEBUG ~ FATAL, OFF 일 경우 로그 사용 안함), 사용 로그 이름(appender 이름)
log4j.rootLogger=INFO, console
# log level and appender
log4j.logger.com.some=DEBUG, console
log4j.logger.com.some.Any=INFO, logfile
log4j.additivity.com.some=false // 상위 로거의 속성을 상속받지 않겠다.(중복 출력하지 않는다)
# Console log
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-5p %l - %m%n
# Daily file log
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.Append=true // restart 시 기존 파일에 추가, false : 새로 씀.
log4j.appender.logfile.Threshold=DEBUG // 여기 명시된 priority 와 같거나 높은 메세지만 로깅
log4j.appender.logfile.ImmediateFlush=true // 로그메세지들이 버퍼되지 않음, 대부분의 상황에 적당
log4j.appender.logfile.File=./log_app.csv
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
log4j.appender.logfile.MaxFileSize=300KB
log4j.appender.logfile.MaxBackupIndex=1 // 최대 파일이 넘어갔을 경우 백업
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%d{HH:mm:ss}][%-5p](%F:%L) - %m%n
# DB로그를 작성하기 위해서는 위와 같이 DB에 Table을 만들어야 한다
# jdbcappender.jar, ojdbc14.zip 파일 필요.
CREATE TABLE APP_LOG
(
SYSTEMNAME VARCHAR2(100 BYTE),
LOGDATE TIMESTAMP DEFAULT SYSDATE,
LOGLEVEL VARCHAR2(100 BYTE),
MDC1 VARCHAR2(100 BYTE),
MDC2 VARCHAR2(100 BYTE),
MESSAGE VARCHAR2(4000 BYTE),
TROWABLE VARCHAR2(4000 BYTE)
)
log4j.appender.dblog=org.apache.log4j.jdbcplus.JDBCAppender
log4j.appender.dblog.url=jdbc:oracle:thin:@127.0.0.1:1521:MCSDB // DB url 정의
log4j.appender.dblog.dbclass=oracle.jdbc.driver.OracleDriver // DB 드라이버 클래스 정의
log4j.appender.dblog.username=sds // DB User 정의
log4j.appender.dblog.password=sdsdb // DB Password 정의
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@') // INSERT SQL문 정의
log4j.appender.dblog.layout=org.apache.log4j.PatternLayout
log4j.appender.dblog.layout.ConversionPattern=%m
log4j.appender.dblog.buffer=1 // DB를 Update하기 전까지 SQL문의 Buffer 개수. 1이면 바로 Update 함
log4j.appender.dblog.commit=true // commit 여부
log4j.appender.dblog.quoteReplace=true // single quotes (')를 2 single quotes ('')로 변경 여부
log4j.appender.dblog.throwableMaxChars=3000 // throwable/exception stack trace의 최대 문자 개수 정의
log4j.debug=true
#log4j.disable=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.rootLogger=, console, debug , error, user
#,socket
# 로거들이 용도 설정
#console : 개발 콘솔용
#debug : 드버그용 / 파일로 출력
#error : 에러 로그용
#user : 모든 로그들을 웹에서 볼수 있게 설정
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.user=org.apache.log4j.DailyRollingFileAppender
# 해당 로거들의 레밸설정
log4j.appender.console.Threshold=INFO
log4j.appender.debug.Threshold=DEBUG
log4j.appender.error.Threshold=ERROR
log4j.appender.user.Threshold=ALL
# 기본값: true / 로그메세지가 버퍼되지 않음.
log4j.appender.debug.ImmediateFlush=true
log4j.appender.error.ImmediateFlush=true
log4j.appender.user.ImmediateFlush=true
# 저장될 파일 경로 및 이름
log4j.appender.debug.File=D:/webapps/log/debug
log4j.appender.error.File=D:/webapps/log/error
log4j.appender.user.File=D:/webapps/web/log/log.html
#파일 교체 주기 설정 / 교체주기는 월, 주, 일, 시간, 분
#yyyy-MM-dd-HH-mm (분단위 일때)
log4j.appender.debug.DatePattern='_'yyyy-MM-dd-HH'.log'
log4j.appender.error.DatePattern='_'yyyy-MM-dd-HH'.log'
log4j.appender.user.DatePattern='_'yyyy-MM-dd-HH'.html'
# error_2001-02-23-17.log 이런식으로 저장함
#기본값: true / 파일끝에 추가 할건지 설정
log4j.appender.debug.append=true
log4j.appender.error.append=true
log4j.appender.user.append=true
#로그 파일 요량 및 백업 파일의 인덱스 수 설정
#log4j.appender.error.MaxFileSize=512kb
#log4j.appender.error.MaxBackupIndex=100
#뿌려질 내용의 패턴 설정 (HTML 레이아웃을 패턴을 정의 할 수 없음)
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) - %m%n
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{DATE} %p %c - %m%n
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{DATE} %p %c - %m%n
# HTMLLayout 사용
log4j.appender.user.layout=org.apache.log4j.HTMLLayout
# 리모트 로그설정
#log4j.appender.socket=org.apache.log4j.net.SocketAppender
#log4j.appender.socket.RemoteHost=localhost
#log4j.appender.socket.Port=4445
#log4j.appender.socket.LocationInfo=false
log4j.appender.lf5=org.apache.log4j.lf5.LF5Appender
log4j.appender.lf5.MaxNumberOfRecords=1000
# set log levels#
# possible levels ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF
log4j.logger.com.star=DEBUG
log4j.logger.org.apache=ERROR
# For JBoss: Avoid to setup Log4J outside $JBOSS_HOME/server/default/deploy/log4j.xml!
# For all other servers: Comment out the Log4J listener in web.xml to activate Log4J.
##### 로깅레벨
# FATAL : 가장 크리티컬한 에러가 발생했을 때 사용
# ERROR : 일반적인 에러가 발생했을 때 사용
# WARN : 에러는 아니지만 주의가 필요할 때 사용
# INFO : 일반적인 정보가 필요할 때 사용
# DEBUG : 일반적인 정보를 상세히 나타낼 때 사용
#
# 로깅레벨의 우선순위는 FATAL이 가장 높고 DEBUG가 가장 낮다
# 예를 들어 레벨을 WARN으로 설정하면 WARN이상되는 로그(FATAL, ERROR, WARN)만 출력
log4j.rootLogger=INFO, stdout, logfile
#log4j.rootLogger=DEBUG, stdout, logfile
# console 사용안할경우..
#log4j.rootLogger=INFO, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n
###### file path 와 파일명 확인 #####
log4j.appender.logfile.File=${catalina.base}/logs/wisesos2.log
##### RollingFileAppender
# 로그 파일에 일정 용량만큼 로그가 채워지면 새로운 파일에 쓰는 방식이다.
# 파일의 갯수도 지정하여 일정 파일 갯수만큼 파일이 생성되었다면 다시 처음의 로그파일에 재기록
#log4j.appender.logfile=org.apache.log4j.RollingFileAppender
#log4j.appender.logfile.MaxFileSize=512KB
#log4j.appender.logfile.MaxBackupIndex=3
##### DailyRollingFileAppender
# 날짜나 시간 주기로 로그파일을 생성하여 기록하는 방식이다.
log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
#---------- every day renew ------------
log4j.appender.logfile.DatePattern='.'yyyy-MM-dd
#---------- every month renew ------------
#log4j.appender.logfile.DatePattern='.'yyyy-MM
#---------- every week renew ------------
#log4j.appender.logfile.DatePattern='.'yyyy-MM-ww
#---------- every 12hours renew -------------
#log4j.appender.logfile.DatePattern='.'yyyy-MM-dd-a
#---------- every hour renew --------------
#log4j.appender.logfile.DatePattern='.'yyyy-MM-dd-HH
#---------- every min renew --------------
#log4j.appender.logfile.DatePattern='.'yyyy-MM-dd-HH-mm
# 서버 restart 시에도 파일이 reset 되지 않는다
# true = append, false = reset
log4j.appender.logfile.Append=true
# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
##### Connection, Statement, PreparedStatement 주석제거 하면 쿼리및 아규먼트 확인 가능
##### 나머지는 옵션으로 활용
##### SqlMap logging configuration...
#log4j.logger.com.ibatis=DEBUG
#log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
#log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
#log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
#log4j.logger.java.sql.ResultSet=DEBUG
# log level = DEBUG ~, use console log, file log
# = FATAL,ERROR,WARN,INFO,DEBUG,TRACE
#log4j.rootLogger = DEBUG, stdout, rolling
# DEBUG 이상, rolling 파일 형태로 로그 기록
log4j.rootLogger = DEBUG, rolling
# config for console output
#log4j.appender.stdout.Threshod = WARN
#log4j.appender.stdout = org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern = [%d] [%c{1}] [%L] [%p] %m %n
# config for file output
log4j.appender.rolling = org.apache.log4j.RollingFileAppender
log4j.appender.rolling.File = /kfg/logs/service.log
log4j.appender.rolling.MaxFileSize = 10KB
log4j.appender.rolling.MaxBackupIndex = 20
log4j.appender.rolling.layout = org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern = [%d{yyyyMMdd-hhmmss.sss}][%F][%L][%p] %m%n
# Layout Description
# org.apache.log4j.SimpleLayout : 기본
# org.apache.log4j.TTCCLayout : 시간 출력에 특화된 레이아웃
# org.apache.log4j.HTMLLayout : HTML
# org.apache.log4j.XMLLayout : XML
# org.apache.log4j.PatternLayout : 사용자 지정 패턴