'JAVA/LOG4J'에 해당되는 글 5건
- 2013.04.20 :: cafe24 log4j 설정방법.
- 2010.12.03 :: Log4J 설정방법 및 웹로직에서 사용방법
- 2009.05.17 :: log4j.properties 사용 방법
- 2009.05.07 :: Log4J 레이아웃
- 2009.05.07 :: Log4J 사용하기
cafe24는 크론탭을 지원해주지 않는다.
해당 방법이 많다고는 하지만 실질적으로 안된다.
log4j.rootLogger = DEBUG, stdout, rolling
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold =INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%5p] [%d][%t] %F.%M()-[%L Line] %m%n
log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
# 로그가 쌓일 위치 적는다.
log4j.appender.rolling.File = /home/hosting_users/cafe24 계정/www/WEB-INF/logs/logfile.log
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=[%5p] [%d][%t] %F.%M()-[%L Line] %m%n
log4j.appender.rolling = org.apache.log4j.DailyRollingFileAppender
# 로그가 쌓일 위치 적는다.
log4j.appender.rolling.File = /home/hosting_users/cafe24 계정/www/WEB-INF/logs/logfile.log
log4j.appender.rolling.Append = true
log4j.appender.rolling.DatePattern = '.'yyyy-MM-dd
log4j.appender.rolling.layout = org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=[%5p] [%d][%t] %F.%M()-[%L Line] %m%n
log4j.logger.org.mybatis=DEBUG
log4j.logger.org.apache=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.scan하는패키지=DEBUG
웹로직에서는 자체 Log4J 가 있기 때문에 별도 설정이 필요하다
override 하면 될것을...-_-;;
org.apache.log4j.PropertyConfigurator.configure(logPath); 이것으로 하단에 참조...
http://payoff.tistory.com/27
http://blog.naver.com/dalbong97/130021029647
1. log4j란?
log4j는 프로그래머가 로그문의 출력을 다양한 대상으로 할 수 있도록 도와주는 도구이다.
애플리케이션에 문제가 생겼을 때, 로깅을 활성화하면 문제의 위치를 찾을 수 있으므로 도움이 된다.
log4j를 사용하면 애플리케이션의 실행코드를 수정하지 않고 런타임에 로깅의 활성화를 할 수 있다.
log4j 패키지는 성능상의 높은 비용을 들이지 않으면서도 배포코드에 로그문장을 남겨놓을 수 있도록 디자인되었다.
그러므로 로깅의 속도(정확히 말하자면 로깅을 하지 않을 때의 속도)가 중요하게 다루어졌다.
동시에 로그 결과는 짧은 시간에 감당하기 어렵게 될만큼 커질 수 있다.
log4j의 독특한 특징 중 하나는 계층적 로거라는 개념이다.
로거를 사용하면, 어떤 로그문이 출력되게 할 지 임의의 단위로 조정할 수 있다.
2. log4j 구성
- Logger(Category)
로깅 메세지를 Appender에 전달합니다.
- Appender
전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지 아니면 DB에 저장할 것인지 매개체 역활을 합니다.
- Layout
Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지 출력 layout을 결졍합니다.
3. log4j 로깅 레벨
로깅의 우선 순위에 따른 로깅 레벨이다.
FATAL > ERROR > WRN > INFO > DEBUG
① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.
② ERROR : 일반 에러가 일어 났을 때 사용합니다.
③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.
④ INFO : 일반 정보를 나타낼 때 사용합니다.
⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.
만약 현재 요청한 로깅의 우선순위가 카테고리의 우선순위와 같거나 높으면
그 로깅 요청이 가능하다고 말한다.
그렇지 않을 경우 그 요청은 불가능하다고 한다.
다음은 로깅 요청의 가능/불가능 여부가 어떻게 처리되는 지를 보여주는 예이다.
// 이름이 "com.foo"인 카테고리 인스턴스를 구한다.
Category cat = Category.getInstance("com.foo");
// 카테고리의 우선순위를 설정한다.
cat.setPriority(Priority.INFO);
// WARN >= INFO 이기 때문에, 이 요청은 가능하다.
cat.warn("Low fuel level.");
// DEBUG < INFO 이기 때문에, 이 요청은 불가능하다.
cat.debug("Starting search for nearest gas station.");
// 이름이 "com.foo.Bar"인 카테고리의 인스턴스를 생성한다.
// 이 카테고리는 이름이 "com.foo"인 카테고리를 상속 받는다.
// 따라서 이 카테고리 인스턴스는 INFO 우선순위를 갖는다.
Category barcat = Category.getInstance("com.foo.Bar");
// INFO >= INFO 이므로, 이 요청은 가능하다.
barcat.info("Located nearest gas station.");
// DEBUG < INFO 이므로, 이 요청은 불가능하다.
barcat.debug("Exiting gas station search");
4. log4j 설정
log4j 설정은 프로그램 내에서 할 수 있지만 설정파일을 사용함으로서 좀더 유연하게 log4j환경을 만들 수 있습니다.
① 프로그램에서 설정
<%@ page contentType="text/html;charset=MS949" import="org.apache.log4j.*,java.io.* " %> <%! <% PatternLayout patternlayout = new PatternLayout(layout); |
② property 파일에 설정
설정 파일의 위치를 별도로 지정하지 않으려면, log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요.
* log4j.properties 파일은 /WEB-INF/classes/ 하위에 있어야 자동으로 load 됨.
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 log4j.appender.rolling.File=output.log log4j.appender.rolling.Append=true log4j.appender.rolling.MaxFileSize=500KB log4j.appender.rolling.DatePattern='.'yyyy-MM-dd log4j.appender.rolling.layout=org.apache.log4j.PatternLayout log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
|
#최상위 카테고리에 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
#로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log
#true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true
#파일 최대 사이즈는 500KB로 설정
log4j.appender.rolling.MaxFileSize=500KB
#파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
#역시나 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
특정 위치의 설정파일을 지정하는 방법
1. WAS 기동 옵션으로
-Dlog4j.configuration=file:D:\StandardPrj\StandardProject\WebContents\WEB-INF\classes\log4j.properties
2. web.xml 파일에 설정
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
3. 클래스에서 직접 로드
org.apache.log4j.PropertyConfigurator.configure(logPath);
VIII. 설정 포맷
① 로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.
형식 | 설명 |
'.'yyyy-MM | 매달 첫번째날에 로그파일을 변경합니다 |
'.'yyyy-ww | 매주의 시작시 로그파일을 변경합니다. |
'.'yyyy-MM-dd | 매일 자정에 로그파일을 변경합니다. |
'.'yyyy-MM-dd-a | 자정과 정오에 로그파일을 변경합니다. |
'.'yyyy-MM-dd-HH | 매 시간의 시작마다 로그파일을 변경합니다. |
'.'yyyy-MM-dd-HH-mm | 매분마다 로그파일을 변경합니다. |
② PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.
형식 | 설명 |
%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)를 출력합니다. |
예시) (같은 색끼리 보시면 됩니다)
위의 test.jsp를 다음 포맷으로 출력해본다면
[%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t] [%x] [%X]는 다음과 같다
[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25] [] []
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
log4j를 적용한 로깅 예제
// 로거 임포트하기
import org.apache.log4j.Logger;
public class ClassName {
/** Log4J 로거 얻기 */
private Logger log = Logger.getLogger(ClassName.class);
public void method() {
if (log.isDebugEnabled()) {
log.debug("디버깅용 메시지");
}
log.info("정보를 남기기위한 메시지");
try {
// 어쩌구 저쩌구 실행...
} catch (Exception ex) {
// 로그에 예외 메시지도 함께 남기기
log.error("예외가 발생했어요~~", ex);
}
}
}
--------------------------------------------------------------------------------
프로바이더 mailto: madvirus@madvirus.net:
현재 티페이지 글로벌(주)의 기술연구소에 있으며,
'JSP 웹 어플리케이션 개발(가메출판사)'을 이동훈씨와 함께 저술한 바 있다.
--------------------------------------------------------------------------------
관련자료
예제 소스 코드
관련링크
Log4j 프로젝트 홈페이지
http://jakarta.apache.org/log4j/index.html
Sun의 로깅 API 규약
http://java.sun.com/aboutJava/communityprocess/jsr/jsr_047_log.html
ERROR : 일반 에러가 일어 났을 때 사용합니다.
WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.
INFO : 일반 정보를 나타낼 때 사용합니다.
DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.
ConversionPattern 사용 방법
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. rn 또는 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)를 출력합니다.
log4j.properties 파일 사용 예
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[COTAMOT] %5p,[%d],[%t],(%F:%L),%m%n
log4j.appender.stdout.target=System.err
#rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
#로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log
#true면 WAS를 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true
#파일 최대 사이즈는 500KB로 설정
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
#rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
#rolling 어펜더는 패턴 레이아웃 포맷
log4j.appender.rolling.layout.ConversionPattern=[COTAMOT] %5p,[%d],[%t],(%F:%L),%m%n
Log4J는 다음과 같은 레이아웃을 제공한다.
SimpleLayout
PatternLayout
HTMLLayout
XMLLayout
SimpleLayout은 다음과 같은 포맷으로 고정되어 있다.
레벨 - 메시지
PatternLayout은 C의 printf()처럼 포맷 설정에 대한 자유도가 크다.
HTMLLayout은 HTML 테이블을 포맷으로 한다.
XMLLayout은 XML 문서를 포맷으로 한다.
Reference:
http://www.allapplabs.com/log4j/log4j_layouts.htm
System.out.println()을 사용하면 되는데 굳이 logger를 사용할 필요가 있을까?
logger를 사용하면, 다음과 같은 장점들이 있다.
- 로그 레벨별로 logging 여부를 결정할 수 있다.
- 로그를 콘솔뿐만 아니라 파일 등에 쓸 수 있다.
- 레벨이나 appender 설정을 파일에서 할 수 있다.
가장 보편적으로 사용되는 Apache Log4J를 사용해보자.
우선 log4j.properties 파일을 다음과 같이 작성한다.
log4j.rootLogger=ALL, console, another_appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%c:%p] - %m%n
log4j.appender.another_appender=org.apache.log4j.RollingFileAppender
log4j.appender.another_appender.File=log/example.log
log4j.appender.another_appender.MaxFileSize=100KB
# Keep one backup file
log4j.appender.another_appender.MaxBackupIndex=1
log4j.appender.another_appender.layout=org.apache.log4j.PatternLayout
log4j.appender.another_appender.layout.ConversionPattern=%d [%c:%p] - %m%n
log4j.properties 파일을 클래스 패스에 포함시켜야만 Log4J가 찾을 수 있다.
이클립스를 사용한다면, properties 폴더에 log4j.properties 파일을 넣고,
Build Path -> Use as Source Folder를 선택한다.
다음으로 Log4J를 사용하는 클래스를 작성한다.
package com.izeye.log4jexample;
import org.apache.log4j.Logger;
public class Log4JExample {
private static final Logger logger = Logger.getLogger(Log4JExample.class);
private static final Logger anotherLogger = Logger.getLogger("another");
public static void main(String[] args) {
String message = "TEST MESSAGE";
while (true) {
logger.debug(message);
logger.info(message);
logger.warn(message);
logger.error(message);
logger.fatal(message);
anotherLogger.debug(message);
anotherLogger.info(message);
anotherLogger.warn(message);
anotherLogger.error(message);
anotherLogger.fatal(message);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
위 클래스를 실행하면, 콘솔의 결과는 다음과 같다.
2009-02-04 19:26:58,375 [com.izeye.log4jexample.Log4JExample:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,375 [com.izeye.log4jexample.Log4JExample:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:FATAL] - TEST MESSAGE
......
log/example.log의 내용도 위와 동일하다.
log4j.rootLogger는 모든 logger의 부모 logger이다.
따라서 등록된 모든 logger가 이 logger의 설정에 영향을 받는다.
com.izeye.log4jexample.Log4JExample 클래스 logger는
WARN 이상의 메시지만 콘솔로 출력하고,
'another' logger는 ERROR 이상의 메시지만
log/example.log 파일로 출력하도록 하기 위해서 다음과 같이 수정한다.
#log4j.rootLogger=ALL, console, another_appender
log4j.logger.com.izeye.log4jexample.Log4JExample=WARN, console
log4j.logger.another=ERROR, another_appender