일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 태터수정
- unix
- 안드로이드
- 알고리즘
- 주식
- adb
- IT 키워드
- uml example
- LDAP
- 도서
- Qmail
- ubuntu
- Linux
- Algorithm
- Audacity
- KOSPI
- conemu
- 우분투
- 보안
- 작성중
- java
- Android
- UX
- Eclipse
- IPTV
- 공매도
- 기술사
- eclipse35
- 코스피
- Today
- Total
Do diffence
Jakarta Commons를 이용한 로깅 본문
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));
}
}
[결과]
9:00:44
정보: Login OK --> jclee