강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

jsp에서 log()이용하기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.gif title44.gif

jsp에서 log() 이용하기

kenu
2002-01-30 6:46오후

로그 log, 통나무입니다. 책에서 보니 선원들이 나무에 날짜가는 것을 표시하는 것에서 "기록을 남기다"라는 뜻이 생겼다고 하던데요. 일리가 있는 것 같습니다. 요즘 제가 좋아하는 책에서 읽었습니다. 무슨 책인지는 안 가르쳐 주지요. ^^ 사이트 게시판 뒤지면 나옵니다.

Tomcat 4 를 기준으로 이 log() 에 대해서 얘기하고자 합니다. 일단 Tocmat 4 를 시동하면 아래 그림과 같이 logs 디렉토리에 log 파일들이 생성됩니다. file 마다 날짜가 붙습니다. 날이 바뀌면 새로운 파일이 생성이 됩니다.
설치경로
tomcat 경로: C:	omcat4
log파일 경로: C:	omcat4logs

log01_01.gif

여기서 살펴볼 파일은 localhost_access_log.2002-01-30.txt, localhost_log.2002-01-30.txt 입니다. localhost_access_log.2002-01-30.txt 는 말 그대로 브라우저로 요청을 한 파일들이 기록되는 곳입니다. localhost_log.2002-01-30.txt 는 log() 메소드를 통해서 기록되는 메시지들이 쌓이게 됩니다.

log.jsp 파일을 만들어서 실행해 보겠습니다. 브라우저에는 아무표시도 나지 않을 것입니다.
c:	omcat4webappsROOTlog.jsp
<%
log("okjsp log");
%>


localhost_access_log.2002-01-30.txt 파일을 열어보면 다음과 같이 요청한 파일에 대한 접근 기록이 남아 있습니다. 간단히 설명하자면 ip - - [시간 9000(?)] "요청방식(GET|POST) URI(파일경로) 프로토콜(HTTP)/버전(1.1) 응답상태코드(200|404|...) 파일크기" (9000 은 GMT 시간을 말하는 것 같은데요.). 머리가 좋으신 분들은 아실 것인데요. tomcat 을 standalone 으로 해서 http 서비스도 한다면 html 이나 이미지(gif, jpg, png) 등 요청되는 모든 것이 log 에 기록됩니다. 다른 웹서버와 연동이 되었을 경우는 jsp 와 servlet 만 기록에 남죠. ^^
c:	omcat4logslocalhost_access_log.2002-01-30.txt
127.0.0.1 - - [30/Jan/2002:20:09:22 9000] "GET /log.jsp HTTP/1.1" 200 -
52.32.10.69 - - [30/Jan/2002:20:09:33 9000] "GET /log.jsp HTTP/1.1" 200 -
52.32.10.69 - - [30/Jan/2002:20:10:46 9000] "GET /proc.jsp?jumin1=710624 HTTP/1.1" 200 15
52.32.10.69 - - [30/Jan/2002:20:19:27 9000] "POST /proc.jsp HTTP/1.1" 200 15


localhost_log.2002-01-30.txt 파일을 열어보면 다음과 같이 파일에 대한 기록이 남아 있습니다. jsp 파일을 처음 servlet 으로 변환해서 실행을 하면 jsp: init 라는 로그 메시지가 생깁니다. jsp 파일을 변경 후 다시 컴파일하고 실행할 때에도 같은 메시지가 생깁니다. 그리고 log("okjsp log") 메소드를 통해서 기록된 메시지를 볼 수 있습니다. 위의 access_log 에 있는 시간과 비교해 보십시오.
c:	omcat4logslocalhost_log.2002-01-30.txt
...
2002-01-30 20:09:22 jsp: init
2002-01-30 20:09:22 jsp: okjsp log
2002-01-30 20:09:33 jsp: okjsp log
2002-01-30 20:10:46 jsp: init
...


log 를 사용하는 간단한 예제를 보겠습니다. form.htm 에서 주민번호 앞자리 6개를 받아서 나이를 계산해 보는 예제입니다. method 를 get과 post 로 바꿔서 실행해보십시오.
c:	omcat4webappsROOTform.htm
<form action="proc.jsp" method="get">
주민등록번호 앞자리는 
  <input type="text" name="jumin1" maxlength="6"> 입니다.
  <input type="submit" value="전송">
</form>


c:	omcat4webappsROOTproc.jsp
<%@ page contentType="text/html;charset=euc-kr" import="java.util.Date"%>
<%
String jumin=request.getParameter("jumin1");
int age = 0;
Date today = new Date();
try{
  age = today.getYear() - Integer.parseInt(jumin.substring(0,2)) + 1;
} catch(NullPointerException e) {
    log("Null");
} catch(NumberFormatException e) {
    log(e.getMessage());
    log("jumin: "+jumin);
} catch(Exception e) {
    log("etc: "+e.getMessage());
}
%><%=age %>살이시군요.


위에서 보시면 jumin1 값으로 넘어온 값에 따라서 null 일 경우 log 에 Null 이라고 찍힐 것같지만 substring(0,2)에서 StringIndexOutOfBoundsException 가 먼저 잡힙니다. 숫자가 아닌 문자가 들어올 경우는 에러메시지와 jumin: <입력값> 이 로그에 찍힐 것입니다. log 파일을 보시면 브라우저에서 확인하지 못한 메시지들을 무수히 많이 볼 수 있습니다. linux(unix) 일 경우 tail -f localhost_log.2002-01-30.txt 로 보시면 실시간으로 메시지를 화면에서 확인할 수 있습니다.

log() 메소드는 API 에서 찾아보면 javax.servlet.ServletContext 과 javax.servlet.GenericServlet 패키지에 속한 메소드임을 알 수 있습니다. 아까 log.jsp 파일이 서블릿에서 어떻게 바뀌었는가 구경해보고 마치도록 하겠습니다.
c:	omcat4webappsROOTproc.jsp
log(Exception, String) - Method in interface javax.servlet.ServletContext 
    Deprecated. As of Java Servlet API 2.1, use ServletContext.log(String message, 
    Throwable throwable) instead. 
    This method was originally defined to write an exception's stack trace and an 
    explanatory error message to the servlet log file. 

log(String) - Method in interface javax.servlet.ServletContext 
    Writes the specified message to a servlet log file, usually an event log. 
log(String) - Method in class javax.servlet.GenericServlet 
    Writes the specified message to a servlet log file, prepended by the servlet's 
    name. 
log(String, Throwable) - Method in interface javax.servlet.ServletContext 
    Writes an explanatory message and a stack trace for a given Throwable exception 
    to the servlet log file. 
log(String, Throwable) - Method in class javax.servlet.GenericServlet 
    Writes an explanatory message and a stack trace for a given Throwable exception 
    to the servlet log file, prepended by the servlet's name.


변환된 servlet 소스 파일은 work 디렉토리 아래에서 찾을 수 있습니다. 저 아래 log() 보이죠?
C:	omcat4worklocalhost\_log$jsp.java
...
    static {
    }
    public log$jsp( ) {
    }
...
            _jspxFactory = JspFactory.getDefaultFactory();
            response.setContentType("text/html;charset=ISO-8859-1");
            pageContext = _jspxFactory.getPageContext(this, request, response,
			"", true, 8192, true);

            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();

            // begin [file="/log.jsp";from=(0,2);to=(2,0)]
                
                log("okjsp log");
            // end

...



마치기 전에 할 말이 생각이 나서요. log 의 형식과 종류는 server.xml 파일에서 지정할 수 있습니다. 이에 관해서는 번역해 놓은 server.xml 파일(4.0.1 버전)을 참고하세요.
C:	omcat4confserver.xml
...
      <!-- 하위수준에서 지정되지 않았다면 사용되는 Global Logger -->
      <Logger className="org.apache.catalina.logger.FileLogger"
              prefix="catalina_log." suffix=".txt"
              timestamp="true"/>
...

        <!-- Access log는 이 가상호스트에 접속하는 모든 요청을 처리합니다. 기본값은
             로그 파일은 $CATALINA_HOME 에 상대적인 "logs" 디렉토리에 생성됩니다.
             "directory" 속성을 이용해서 원하는 다른 디렉토리로 지정할 수 있습니다.
             ($CATALINA_HOME 에 대해) 상대적인 디렉토리나 또는 원하는 디렉토리의 
             절대 경로를 써주면 됩니다.
        -->
        <Valve className="org.apache.catalina.valves.AccessLogValve"
                 directory="logs"  prefix="localhost_access_log." suffix=".txt"
                 pattern="common"/>

        <!-- 이 가상 호스트에 관계된 모든 Context 에 의해 공유된 Logger. 기본값은
             (FileLogger 를 사용할 때), 로그 파일들은 $CATALINA_HOME 에 상대적인 
             "logs" 디렉토리에 생성됩니다. "directory" 속성을 이용해서 원하는 다른
             디렉토리로 지정할 수 있습니다. ($CATALINA_HOME 에 대해) 상대적인 디렉
             토리나 또는 원하는 디렉토리의 절대 경로를 써주면 됩니다.
        -->
        <Logger className="org.apache.catalina.logger.FileLogger"
                 directory="logs"  prefix="localhost_log." suffix=".txt"
	        timestamp="true"/>

...




에러를 잡는데 유용한 방법입니다. System.out.println("중간값"+val); 을 소스의 중간중간 삽입한 뒤에 실행해도 됩니다만, log() 를 사용하면 시간이 자동으로 찍히는 잇점이 있고, 타이핑 수도 줄어듭니다. 나중에 유용하게 사용하시길...

관련 사이트
http://jakarta.apache.org/tomcat/tomcat-4.0-doc/config/logger.html
The Logger Component 문서
http://jakarta.apache.org/tomcat/tomcat-4.0-doc/config/valve.html#Access Log Valve
Access Log Valve 문서
http://tucows.kr.psi.net/log95.html
log 분석 Utils

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,039 명
  • 현재 강좌수 :  35,845 개
  • 현재 접속자 :  105 명