log4j-1.2.14.jar 파일을 JDK설치된 폴더의 lib/ext 디렉토리에 카피 후
프로젝트 properties 의 Java Build Path > Library > Add External Jars ... 에서 추가시킴
LOG4J
I. 들어가면서.. 그리고 log4j
log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.
로깅(logging)은 코드의 가독성을 떨어뜨리는 단점이 있지만, 애플리케이션에 문제가 있을 때 개발자가 자세한 상황을 파악할 수 있도록 해 주며 테스팅시 빠질 수 없는 요소입니다.
아마도 여러분들은 여러 어플리케이션이 추가되면서 각 개발자들만의 독특한 로깅방식이 서로 썩이고 얽혀서 화면에 나타나는것을 많이 봤을겁니다 -_-;
즉 로깅 방법을 통일할 필요가 있는것이죠. 모든 개발자가 특정 포맷에 맞추어서 로깅 한다면 한결 로깅하기도 편하겠지요
오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다. 성능 또한 우수해 더 이상 System.out.println을 사용할 필요가 없습니다.
II. 다운로드
*다운로드 http://logging.apache.org/log4j/docs/download.html *매뉴얼 http://logging.apache.org/log4j/docs/documentation.html *API spec http://logging.apache.org/log4j/docs/api/index.html |
III. LOG4J 구조
일단 log4j를 잘 모르지만 그 구조만 살짝 살펴보고 넘어갑시다. log4j는 크게 3가지 요소로 구성되며 그 구조는 다음과 같습니다.
① Logger(Category) : 로깅 메세지를 Appender에 전달합니다. ② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지 아니면 DB에 저장할 것인지 매개체 역활을 합니다. ③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것인지, 출력 layout을 결정합니다. |
IV. LOG4J 로깅 레벨
log4j는 다양한 로깅레벨을 지원합니다.
① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다. ② ERROR : 일반 에러가 일어 났을 때 사용합니다. ③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다. ④ INFO : 일반 정보를 나타낼 때 사용합니다. ⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다. |
만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다. WARN, ERROR, FATAL 의 로깅이 됩니다.
V. 샘플코드 1
jsp에서 사용하는 예제가 없어 만들어 봤습니다.
test.jsp
<%@ page contentType="text/html;charset=MS949"
import="org.apache.log4j.Logger" %>
<%!
static Logger logger = Logger.getLogger("test.jsp");
%>
<%
logger.fatal("fatal!!");
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.*;
import javax.servlet.http.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class TestServlet extends HttpServlet {
static Logger logger = Logger.getLogger(TestServlet.class);
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
...
logger.info("Hellow World~");
...
} catch (Exception e) {
logger.error("Error at TestServlet", e);
}
}
}
VII. LOG4J 설정
log4j 설정은 프로그램 내에서 할 수 있지만, 설정 파일을 사용함으로서 좀 더 유연하게 log4j 환경을 만들 수 있습니다.
① 프로그램에서 설정
<%@ page contentType="text/html;charset=MS949"
import="org.apache.log4j.*,java.io.* "
%><%!
static Logger logger = Logger.getLogger("log4j.jsp");
%>
<%
String layout = "%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n";
String logfilename = "DailyLog.log";
String datePattern = ".yyyy-MM-dd ";
PatternLayout patternlayout = new PatternLayout(layout);
DailyRollingFileAppender appender = new DailyRollingFileAppender(patternlayout, logfilename, datePattern);
logger.addAppender(appender);
logger.setLevel(Level.INFO);
logger.fatal("fatal!!");
%>
② property 파일에 설정
log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요
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
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)를 출력합니다. |
=============================================
본문서는 자유롭게 배포/복사 할수 있지만
이문서의 저자에 대한 언급을 삭제하시면 안됩니다
저자 : GoodBug (unicorn@jakartaproject.com)
최초 : http://www.jakartaproject.com
=============================================
'Programming Language > Java' 카테고리의 다른 글
[Java] Unzip 코드(TEST) java (0) | 2018.04.05 |
---|---|
NullPointerException while using a setter on fragment (0) | 2018.03.09 |
[Java] jdk 구버전 다운로드 링크 (0) | 2018.01.15 |
[Java] 자바 바이트코드 소개 (스크랩) (0) | 2018.01.11 |
Javassist 로 클래스 의존성 식별 (0) | 2018.01.11 |