Do diffence

Jakarta Commons를 이용한 로깅 본문

OLD

Jakarta Commons를 이용한 로깅

고포릿 2006. 12. 13. 17:17


Jakarta Commons를 이용한 로깅



Jakarta Commons
로깅 패키지는 공통의 로깅 API로 사용 가능하며 동시에 여러
로깅 구현체(Log4J, JDK1.4 로깅, SimpleLog)들이 사용 가능한 오픈 소스 라이브러리 입니다. 그러므로 Commons 로깅 패키지를 사용하면서 구현체를 JDK1.4의 로깅
기능을 이용하다가 Jakarta Log4J로 바꾸더라도
수정이 필요 없다는 말 입니다. 결국 확장성이 뛰어난 로깅 방법 입니다.



Commons
의 로깅 API는 아래와 같은 로깅 구현체를 지원 합니다.



log4j (http://jakarta.apache.org/log4j)

JDK 1.4 Logging

LogKit (http://jakarta.apache.org/avalon/logkit)

SimpleLog (writes log messages to stdout and
stderr)

NoOpLog (log messages are ignored)



위에서 SimpleLog NoOpLog를 제외한
나머지 구현체를 이용하기 위해서는 다운받아 사용 해야 합니다.



------------------------------------

Commons
로깅 패키지 설치

------------------------------------



Struts1.1
이상에는 commons-logging.jar 파일이 포함되어 있으니 이
파일을 이용하기로 합니다. 아마도 WEN-INF/lib
스트럿츠를 사용하기 위해 jar 파일을 복사 할 때 따라와서 설치되어 있을 겁니다.



다음으로 할 일은 로깅 구현체를 선택 해야 하는데 Commons 로깅 패키지는 표준출력에
로그를 기록하는 SimpleLog를 기본적으로 포함 합니다.



사용할 로깅 구현체를 선택 했으면 애플리케이션이 구동 할 때 Commons 로깅 팩토리
컴포넌트에서 로깅 구현체를 인식 할 수 있도록 로깅 구현체 클래스를 설정 해야 합니다.



여러 방법이 있지만 쉬운 것은 commons-logging.properties 라는 파일을
생성 하는 것인데 이 파일에서 가장 중요한 부분이 org.apache.commons.logging.log라는
키입니다.



SimpleLog
를 사용 한다면 다음과 같이 하면 됩니다.



org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog



로깅 컴포넌트는 실행 시 commons-logging.properties 파일을 검색 해
전체 클래스 이름을 찾아 초기화를 진행 합니다. 만약 구현체를
Log4J
를 이용 한다면 다음과 같이 설정 하면 됩니다.



org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog



Log4J
의 경우 이렇게 설정 한 후 log4j.properties를 적절하게 설정 해야
합니다.



만약 SimpleLog를 이용한다면
commons-logging.properties
에서 위에서 설정한 것처럼 하지 않아도 잘 동작 합니다.



-----------------------------------

Commons logging API
사용하기

-----------------------------------



로깅 API의 사용을 위해서는 다음과 같이 import문을
사용해야 합니다.



import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;



메시지 기록을 위한 로그 컴포넌트의 인스턴스를 얻기 위해서는
org.apache.commons.logging.LogFactory
클래스의 getLog() 메소드를
이용 합니다.



public static Log getLog(Class class);

public static Log getLog(String name)



만약 LoginAction에서 사용 할 Log 인스턴스를
생성하기 위해서는 다음과 같이 하면 됩니다.



Log log = LogFactory.getLog(LoginAction.class);



이제 LoginAction에서는 다음과 같이 이를 이용 합니다.



if (log.isInfoEnabled()) {

+ id);à        log.info(Login OK

}



Log
인터페이스는 메시지를 보내는데 사용 할 로깅 메소드를 구현하고 있으며 주 메소드는 다음과 같습니다.



debug(), error(), fatal(), info(), trace(), warn()



각각의 로그 메소드는 Throwable 인스턴스를 인자로 하는 오버로딩 메소드를 포함하고
있으며 Log인터페이스는 이외에도 디버그 로그가 가능한지 에러로그가 가능 한지 확인 할 수 있는 메소드를
제공 합니다.



만약 아래와 같은 상황에서 맨 마지막의 log.debug(buf.toString())
했는데 이를 실행하지 못하는 경우가 생길 수 있습니다. 이러한 경우에는 append() 메소드를 실행을 안하는 것이 훨씬 효율적 입니다.



StringBuffer buf = new StringBuffer( );

buf.append( "Login Successful - " );

buf.append( "Name: " );

buf.append( userView.getFirstName( ) );

buf.append( " " );

buf.append( userView.getLastName( ) );

buf.append( " - " );

buf.append( "Email: " );

buf.append( userView.getEmailAddress( ) );

// Log the information for auditing purposes

log.debug( buf.toString( ) );



아래처럼 확인 하는 절차를 추가 할 수 있습니다.



if ( log.isDebugEnabled( ) ){

StringBuffer buf = new StringBuffer( );

buf.append( "Login Successful - " );

buf.append( "Name: " );

buf.append( userView.getFirstName( ) );

buf.append( " " );

buf.append( userView.getLastName( ) );

buf.append( " - " );

buf.append( "Email: " );

buf.append( userView.getEmailAddress( ) );

// Log the UserView for auditing purposes

log.debug( buf.toString( ) );

}



==================================================





DB를 이용하여 로그인 하기 강좌의 LoginAction.java를 다음과 같이 수정 후 main.jsp를 실행하여 로그인을 하게 되면 아래 결과 처럼 로그가 출력 되는 것을 확인 할 수 있습니다.





[LoginAction.java]



package login2;



import org.apache.struts.action.Action;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpServletResponse;

import login2.LoginForm;

import login2.Constants;

import org.apache.struts.action.ActionErrors;

import org.apache.struts.action.ActionError;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionMapping;

import org.apache.struts.action.ActionForward;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;





/**

* @author
이종철

*/

public class LoginAction extends Action {

               

       public
ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest
request, HttpServletResponse response) {

                       Log log = LogFactory.getLog(LoginAction.class);

               

               String id = ((LoginForm)form).getId();

               String pwd = ((LoginForm)form).getPwd();

               

               

               //Model을 이용하기 이용하여 인증부분의 처리를 합니다.

               LoginDAO loginDAO = new LoginDAO();

               UserInfoVO userinfo = loginDAO.authUser(id, pwd);

               

               //에러 내용을 담을 ActionErrors 객체를 생성

               ActionErrors errors = new ActionErrors();

               

               if (userinfo==null) {

                       //인증 실패                        

                       errors.add(ActionErrors.GLOBAL_ERROR, new
ActionError("error.login.invalid"));
                       

               }

               

               

               if (!errors.isEmpty()) {

                   saveErrors(request, errors);

                  return (mapping.getInputForward());

               }        

                       

               //인증 성공한 경우 세션에 LoginInfoVO(로그인한 사용자 정보를
담은 객체)저장

               HttpSession session = request.getSession();

               session.setAttribute(Constants.USER_KEY, userinfo);

   

               

               //로그를 남기자. 주석으로 막은 부분은 기존에 처리 했던 방식 입니다.

               //StringBuffer buf = new StringBuffer("LoginAction : User
--> ");

               //buf.append(id + " logged in session");

               //servlet.log(buf.toString());

               if (log.isInfoEnabled()) {

                       log.info("Login OK --> " + id);

               }

                             

               return (mapping.findForward(Constants.SUCCESS));                        

               

       }



       

}







[
결과]

2005. 1. 29
오전
9:00:44
login2.LoginAction execute

정보: Login OK --> jclee