본문 바로가기

OpenSource/Log4J

Log4J 간단 사용법

* log4j를 사용하면 다음과 같은 장점이 있습니다.(일반적인 견해 + 개인적인 생각 ㅡ_ㅡ)
1. sysout남발로 인한 소스및 로그가 지저문해지는것을 방지.
2. sysout남용으로 인한 성능저하 방지.
3. 로그 모니터링및 문제 발생시 추적이 편해집니다.
4. 개발자들간에 로깅 방식이 통일되어 일관성있는 로깅이 가능해집니다.

* 그럼 지금부터 간단하게 log4j 설정해보겠습니다.

1. jar 다운로드 : http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip
(스프링프레임웤을 다운받은적이 있는분은 (다운받은 스프링폴더)\lib\log4j에 보면 log4j-1.2.15.jar라는 파일이 있습니다.)

2.  log4j-1.2.15.jar(Log4J버전에 따라 뒤에 숫자는 차이가 있습니다.)를 [프로젝트 소스폴더]\WebContent\WEB-INF\lib로 복사해서 추가합니다.


이클립스에서 프로젝트를 클릭하고 F5를 누른후 위와 같이 추가된것이 확인되면 문제 없이 추가 된겁니다.

3. 다음으로 web.xml설정을 입니다. web.xml에 다음 코드를 주가합니다.
 <listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>
 <context-param>
  <param-name>log4jConfigLocation</param-name>
   <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>

위에 빨간색으로 된 부분은 앞으로 만들게 될 프로퍼티 파일 경로입니다.

4. 다음으로 프로퍼티 설정입니다.

4-1 Log4J 로깅레벨
① FATAL : 치명적인 에러가 났을때 사용.
② ERROR : 일반 에러.
③ WARN : 경고(프로그램은 동작하지만 주의가 요구될때).
④ INFO : 일반 정보.
⑤ DEBUG : 상세정보.

로그출력은 설정파일(property 또는 xml)에서 설정된 레벨 이상급들만 출력됩니다.
예를들면, 레벨을 INFO로 설정하면 그 이상의 레벨들이 출력됩니다.
즉, 프로그램 소스에서 DEBUG로된 로그는 출력되지 않고 INFO, WARN, ERROR, FATAL로
된 로그들이 출력됩니다.


4-2 /WEB-INF/log4j.properties 작성.

# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, dailyfile을 정의
log4j.rootLogger = DEBUG, stdout, dailyfile

# console
log4j.appender.stdout = org.apache.log4j.ConsoleAppender # 콘솔에 뿌려줌.
log4j.appender.stdout.Threshold = DEBUG  # DEBUG이상 레벨만 출력.
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout # 패턴설정
log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n # 패턴설정

# file
log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender # 일별 파일로 관리
log4j.appender.dailyfile.DatePattern='.'yyyy-MM-dd # 파일명 포맷 : logfile.log.2009-11-17 과같은 형식
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n
log4j.appender.dailyfile.File = E:/Study/source/Spring_MVC_Ex/WebContent/WEB-INF/log/logfile.log

# iBatis
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG


4-3 로그파일명 포맷 (DatePattern) : 위에서 "log4j.appender.dailyfile.DatePattern='.'yyyy-MM-dd" 부분입니다.
형식 설명
'.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
'.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
'.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
'.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.

4-4 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)를 출력합니다.

예시) (같은 색끼리 보시면 됩니다)

[%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] [] []

5. 프로그램 적용

package com.lcy.controller;

import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class HelloController extends MultiActionController{
 private Logger log = Logger.getLogger(this.getClass());       # Logger객체를 얻고
 
 public ModelAndView hello(HttpServletRequest request, HttpServletResponse response) throws Exception {
  log.debug("================ Method Name : hello");        # 실제로 로그를 찍는 부분입니다.
  ModelAndView mav = new ModelAndView("hello/hello");
  mav.addObject("hello", "hello world");
  return mav;
 }
 
 public ModelAndView now(HttpServletRequest request, HttpServletResponse response) throws Exception {
  log.debug("================== Method Name : now");
  ModelAndView mav = new ModelAndView("hello/now");
  Date curDate = new Date();
  mav.addObject("curDate", curDate);
  return mav;
 }

}


6. 출력
대략 아래와 같은 로그가 찍히는것을 확인할수있습니다. ㅡ_ㅡ;;
 2009-11-18 11:30:56,236 DEBUG [http-8090-2] controller.HelloController (HelloController.java:16)     - ================ Method Name : hello

7. daily file
다음날이 되면 아래처럼 날짜별로 파일이 저장됩니다.



* 참고자료 http://www.jakartaproject.com


'OpenSource > Log4J' 카테고리의 다른 글

Log4J XML설정 예제  (0) 2010.05.26