제11장 Logging

내용 목차

11.1. 개요
11.2. JEUS 로거 기본 구조
11.2.1. 기본 로거 파일 위치
11.2.2. 로그 포맷
11.2.3. 로거 리스트
11.2.4. 사용자 로거
11.2.5. 로그 메시지 모듈 이름
11.3. JEUS Logging 설정
11.3.1. 로거 설정
11.3.2. 로그 파일 Rotation 설정
11.3.3. 표준 출력과 표준 에러를 로그 형식으로 출력 설정
11.3.4. 동적으로 Logging 레벨 설정
11.3.5. 프로퍼티 설정

본 장에서는 JEUS Logging 시스템에 대해 JEUS의 로거 구조 및 각 로거와 핸들러를 설정하는 방법, 로그 메시지의 내용에 대한 설명한다. JEUS 로거 시스템은 Java SE Logging API를 기반으로 구현되었기 때문에 개발자는 이 API를 통해 JEUS Logging 시스템을 Customize할 수 있다.

11.1. 개요

JEUS Logging은 JEUS 실행 중에 시스템에서 수행되었던 일련의 작업들에 대한 내용을 순서대로 보관, 기록하는 작업이다. 이를 통해서 시스템 관리자는 JEUS에서 일어난 여러 작업들에 대한 내용을 이해하고, JEUS 실행 도중에 발생한 여러 에러 상황을 파악하여 그에 따른 대처를 할 수 있다.

JEUS는 시스템 및 애플리케이션에서 발생하는 여러 가지 상황들을 로그(log)를 통해 알려준다. JEUS는 Java SE에서 기본으로 제공되는 표준 Logging API(java.util.logging)를 사용한다. 따라서 Logging 시스템의 구조나 설정 방식도 Logging API를 따르며 로거(logger), 핸들러(handler), Formatter 구조를 그대로 반영하고 있다. 또한, 개발자가 Logging API를 이용하여 JEUS의 로거를 사용할 수 있다.

JEUS 로거는 노드와 엔진 컨테이너, 그리고 엔진 각각에 별도로 설정할 수 있다. 각 로거는 “jeus” 로거(여기서 “jeus”는 로거의 이름)를 기준으로 생성되어 있다. JEUS Manager와 엔진 컨테이너들은 모두 “jeus” 로거를 기본적으로 생성한다. 하위에 생기는 여러 가지 모듈들은 jeus.ejb 등과 같이 jeus 하위의 로거를 생성해서 사용한다.

이런 여러 가지 로거 중에서 JEUS 설정 파일에서 설정 가능한 로거는 다음과 같다.

  • jeus

  • jeus.systemuser

  • jeus.ejb

  • jeus.servlet

  • jeus.jms

  • jeus 로거의 하위 로거

  • java 로거

로거들에 대해 핸들러(handler)를 설정할 수 있는데, 이렇게 설정된 핸들러를 통해 로그 메시지를 기록한다. JEUS에서는 로그 메시지 output의 형태에 따라 여러 가지 종류의 핸들러를 설정할 수 있는데, 가장 많이 사용하는 것은 콘솔 핸들러(console handler)와 파일 핸들러(file handler)이다.

구분설명
콘솔 핸들러로거를 통해 logging되는 로그 메시지를 콘솔 화면에 출력한다.
파일 핸들러로거를 통해 logging되는 로그 메시지를 파일로 저장한다.

이 외의 핸들러에 대한 설명과 각 로거에 대한 핸들러를 JEUS 설정 파일에 설정하는 방법에 대해서도 역시 “11.3.1. 로거 설정”에서 설명한다. Logging 시스템에 대한 기본적인 이해는 Java SE의 Logging API를 참고한다.

11.2. JEUS 로거 기본 구조

로거를 사용하기 위한 기본 개념을 먼저 설명하고 실제 설정 방법을 설명한다.

11.2.1. 기본 로거 파일 위치

파일 핸들러(file handler)를 사용할 경우 파일 이름을 따로 지정하지 않는다면 각 JEUS 로거의 로그 메시지는 정해진 위치에 파일을 생성한다. 그 외의 로그 파일은 Logging 설정을 하는 경우에만 생성된다.

다음은 각 로거의 기본 위치이다.

  • 디폴트 컨테이너 사용할 경우(<node> 하위의 <system-logging>에 설정한다)

    항목설명
    jeusJEUS Manager에서 남겨지는 로그는 JEUS_HOME\logs\<node-name> 디렉터리에 JeusServer.log 파일로 남겨진다. 각 엔진 컨테이너의 로그는 JEUS Manager에서 생성한 jeus 로거를 사용하여 로그를 남긴다.
    jeus.systemuser각 엔진 컨테이너의 user log는 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE 디렉터리에 UserLog.log 파일로 남겨진다.
    jeus.ejbEJB 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\ejb 디렉터리에 error.log 파일로 남겨진다.
    jeus.servlet서블릿 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\servlet\errorlog 디렉터리에 error.log 파일로 남겨진다.
    jeus.jmsJMS 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\jms 디렉터리에 error.log 파일로 남겨진다.
    jeus 로거의 하위 로거

    엔진 로거를 제외한 "jeus" 로거의 모든 하위 로거는 JEUS_HOME\logs\<node-name> 디렉터리에 로거 이름을 가진 파일로 남겨진다.

    (예: jeus.jndi의 경우 jeus.jndi.log파일이 생성된다.)

  • 디폴트 컨테이너를 사용하지 않고 <engine-container> 하위의 <system-logging>에 설정한 경우

    항목설명
    jeus각 엔진 컨테이너의 로그는 JEUS_HOME\logs\<node-name>\<node-name>_<container-name> 디렉터리에 <node-name>_<container-name>.log 파일로 남겨진다.
    jeus.systemuser각 엔진 컨테이너의 user log는 JEUS_HOME\logs\<node-name>\<node-name>_<container-name> 디렉터리에 UserLog.log 파일로 남겨진다.
    jeus.ejbEJB 엔진의 로거는 JEUS_HOME\logs\<node-name>\<node-name>_<container-name>\ejb 디렉터리에 error.log 파일로 남겨진다.
    jeus.servlet서블릿 엔진의 로거는 JEUS_HOME\logs\<node-name>\<node-name>_<container-name>\servlet\errorlog 디렉터리에 error.log 파일로 남겨진다.
    jeus.jmsJMS 엔진의 로거는 JEUS_HOME\logs\<node-name>\<node-name>_<container-name>\jms 디렉터리에 error.log 파일로 남겨진다.
    jeus 로거의 하위 로거

    엔진 로거를 제외한 "jeus" 로거의 모든 하위 로거는 JEUS_HOME\logs\<node-name>_<container-name> 디렉터리에 로거 이름을 가진 파일로 남겨진다.

    (예: jeus.jndi의 경우 jeus.jndi.log파일이 생성된다.)

  • 디폴트 컨테이너를 사용하지 않는데 <node> 하위의 <system-logging>에 설정한 경우

    항목설명
    jeusJEUS Manager에서 남겨지는 로그는 JEUS_HOME\logs\<node-name> 디렉터리에 JeusServer.log 파일로 남겨진다.
    jeus.systemuser각 엔진 컨테이너의 user log는 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE 디렉터리에 UserLog.log 파일로 남겨진다.
    jeus.ejbEJB 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\ejb 디렉터리에 error.log 파일로 남겨진다.
    jeus.servlet서블릿 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\servlet\errorlog 디렉터리에 error.log 파일로 남겨진다.
    jeus.jmsJMS 엔진의 로거는 실행되는 엔진 컨테이너 이름의 JEUS_HOME\logs\<node-name>\SYSTEM_ENGINE\jms 디렉터리에 error.log 파일로 남겨진다.
    jeus 로거의 하위 로거

    엔진 로거를 제외한 "jeus" 로거의 모든 하위 로거는 JEUS_HOME\logs\<node-name> 디렉터리에 로거 이름을 가진 파일로 남겨진다.

    (예: jeus.jndi의 경우 jeus.jndi.log파일이 생성된다.)

참고

디폴트 컨테이너의 경우는 로거 설정을 하더라도 무시된다. 매니저와 같은 JVM이기 때문에 매니저의 로거를 공유한다.

만약 매니저에는 로거 설정을 하지 않고 디폴트 컨테이너에만 로거 설정을 한 경우 설정이 적용되지 않는다. 이때 로거는 콘솔 핸들러만 사용해서 출력되고 레벨은 INFO이다.

11.2.2. 로그 포맷

JEUS에서 제공되는 로그의 포맷은 다음과 같다.

  • [시간] [레벨] [버전] [Logging되는 스레드 정보] [로그 메시지 ID] 로그 메시지

    항목설명
    시간'년.월.일 시간:분:초' 의 형식으로 출력된다.
    레벨

    로그 레벨이 그에 매핑되는 숫자로 출력된다.

    • 0: SEVERE

    • 1: WARNING

    • 2: INFO

    • 3: CONFIG

    • 4: FINE

    • 5: FINER

    • 6: FINEST

    • 7: ALL

    버전JEUS의 빌드 버전을 표시한다.
    Logging되는 스레드 정보Logging하는 프로세스(노드 또는 컨테이너 이름)와 스레드 번호로 표현되며, 이 둘은 하이픈('-')으로 구분된다. 스레드 정보가 같은 로그는 같은 스레드에서 Logging한 메시지이다.
    로그 메시지 ID로그를 출력하는 각 모듈에 대한 정보로 모듈 이름과 메시지 번호로 표현되며, 이 둘은 하이픈('-')으로 구분된다. 각 모듈에 해당하는 이름은 “11.2.5. 로그 메시지 모듈 이름”을 참고한다.
    로그 메시지실제 로그 메시지를 출력한다.

    다음은 실제 JEUS 서버에 출력되는 로그 메시지의 예이다.

    [예 11.1] 로그 메시지 출력

    [2007.01.29 19:43:53][2][b007] [johan-10] [JNSS-0022] 
    JEUS naming server successfully exported.
    ...
    [2007.01.29 19:43:54][2][b007] [johan-10] [JMX-0046] 
    Create Jeus System MBeanServer
    ...
    [2007.01.29 19:44:23][0][b007] [johan-10] [MGR-0241] 
    JeusServer is Ready


    우선, 첫 번째 로그 메시지는 2007년 1월 29일 오후 7시 43분 53초에 출력된 레벨 2(INFO 레벨)의 메시지이며, 현재 실행되고 있는 JEUS의 버전은 build version b007라는 것을 알려준다. 또한 이 로그는 'johan'이라는 노드에서 10번 스레드에 의해 Logging되었고, JNSS(JNSServer에 해당하는 모듈 이름)모듈의 22번 메시지가 출력되었음을 알 수 있다.

    실제 로그 메시지는 JEUS의 Naming Server가 성공적으로 export되었음을 알려준다. 두 번째, 세 번째 로그 메시지 역시 첫번째 메시지와 같은 프로세스에서 Logging되었음을 할 수 있으며, 각각 JMX와 MGR(JEUSManager에 해당하는 모듈 이름)의 메시지가 출력되었음을 알 수 있다. 실제 로그의 내용도 JEUS의 MBean 서버와 JEUS 서버가 성공적으로 실행되었음을 알려주고 있다.

11.2.3. 로거 리스트

  • EJB 관련

    구분설명
    jeus.ejb.beanEJB Home/Object stub 관련 로거
    jeus.ejb.clusterEJB 클러스터링 관련 로거
    jeus.ejb.compilerEJB stub compiler 관련 로거
    jeus.ejb.connectorMDB와 리소스 어댑터 관련 로거
    jeus.ejb.containerEJB 컨테이너 관련 로거
    jeus.ejb.ejbserverEJB 엔진 관련 로거
    jeus.ejb.interopEJB CORBA 연동 관련 로거
    jeus.ejb.persistenceCMP 관련 로거
    jeus.ejb.schemaEJB QL 관련 로거
    jeus.ejb.timerEJB Timer 관련 로거
    jeus.ejb.transactionEJB Transaction & Synchronization 관련 로거
    jeus.ejb.webserverEJB classftp 관련 로거
    jeus.ejb.util기타 로거
  • JPA 관련

    구분설명
    jeus.persistenceJPA 모듈의 최상위 로거
    jeus.persistence.providerTopLink Essentials (default provider)의 최상위 로거
    jeus.persistence.containerJPA에 대한 컨테이너 로거
  • 서블릿 관련

    구분설명
    jeus.servlet.common서블릿 공통 모듈 관련 로거
    jeus.servlet.connectionconnector 관련 로거
    jeus.servlet.connectorNIO connector 관련 로거
    jeus.servlet.deploymentDeploy 관련 로거
    jeus.servlet.engine서블릿 주요 처리 과정 관련 로거
    jeus.servlet.filter필터 관련 로거
    jeus.servlet.jspJSP 관련 로거
    jeus.servlet.listener서블릿 Listener 관련 로거
    jeus.servlet.loader클래스 로더 관련 로거
    jeus.servlet.property프로퍼티 관련 로거
    jeus.servlet.servletsJEUS에서 제공하는 서블릿 관련 로거
    jeus.servlet.util유틸리티에서 사용하는 로거
    jeus.webserverClass FTP 서비스에서 사용하는 로거

  • Session Manager 관련

    구분설명
    jeus.sessionSession Manager의 최상위 로거, 공통적으로 사용되는 로거
    jeus.session.central중앙 Session Manager의 로거
    jeus.session.distributed분산 Session Manager의 로거
  • 웹 서비스 관련

    • JAX-RPC/SAAJ 로거

      구분설명
      jeus.webservices.clientjeus.webservices.client 패키지(client invocation framework) 관련 로거
      jeus.webservices.encodingSOAP serialize/deserialize 관련 로거
      jeus.webservices.messageSAAJ 및 SOAP 메시지 관련 로거
      jeus.webservices.wsdlWSDL 처리 관련 로거
      jeus.webservices그 외 웹 서비스 관련 로거
    • UDDI 로거

      구분설명
      jeus.uddi.datastoreDatabase processing 관련 로거
      jeus.uddi.functionUDDI API message processing 관련 로거
      jeus.uddi.judyRegistry Server Engine 관련 로거
      jeus.uddi.registryTransport layer, Reqeust/Response processing, Registry 엔진 관련 로거
    • WS-* 로거 (JAX-RPC 기반)

      구분설명
      jeus.webservices.wssws-security 관련 로거
    • 기타

      구분설명
      jeus.xml.binding.webservicesHelperEWS(JSR109)에 사용되는 DD 바인딩 관련 로거
  • 트랜잭션 관련

    구분설명
    jeus.transaction트랜잭션 매니저 전반적으로 사용하는 로거
    jeus.transaction.loggingrecovery에 사용되는 Resource Factory 관련 로거
    jeus.transaction.otsOTS 관련 로거
    jeus.transaction.recovery트랜잭션 recovery 작업 내용을 기록하는 로거
  • Security 관련

    구분설명
    jeus.securityJEUS Security 관련 로거
    jeus.security.impl.loginJEUS Security 로그인 서비스 관련 로거
    jeus.security.utilJEUS Security 유틸리티 관련 로거
  • 기타

    구분설명
    jeus.classloaderJEUS 클래스 로딩 관련 로거
    jeus.clusteringJEUS 노드 클러스터링 관련 로거
    jeus.connectorJ2EE Connector 관련 로거
    jeus.converterXML 컨버터 관련 로거
    jeus.ddinitDeployment Descriptor Initializer 관련 로거
    jeus.deploy애플리케이션 Deploy 관련 로거
    jeus.ioJEUS Network I/O library 관련 로거
    jeus.jdbcJDBC Connection Pool 관련 로거
    jeus.jmxJMX 관련 로거
    jeus.jndiJNDI 관련 로거
    jeus.jnlpJNLP 관련 로거
    jeus.jtmaxJTmax 관련 로거
    jeus.managementJMX MBean Framework 관련 로거
    jeus.netJEUS Network API 관련 로거
    jeus.netutilJEUS 통합 포트 관련 로거
    jeus.nodecontrollerJEUS 노드 콘트롤러 관련 로거
    jeus.rmiJEUS RMI 관련 로거
    jeus.schedulerJEUS 스케줄러 관련 로거
    jeus.serviceJEUS 서비스 MBean 관련 로거

11.2.4. 사용자 로거

JEUS의 각 엔진 컨테이너마다 제공되는 사용자 로거(user logger)는 개발자가 별도의 로거를 사용할 필요 없이 JEUS에서 제공하는 로거를 사용할 수 있도록 한다. Java SE Logging API의 java.util.logging.logger API를 사용해서 사용자 로거를 사용할 수 있다.

11.2.5. 로그 메시지 모듈 이름

JEUS에서 제공되는 로그 메시지는 여러 가지 정보를 제공하고 있다. 그 중 로그 메시지의 형식에 따라 모듈의 정보를 출력하는 로그 메시지 정보에서는 각 모듈의 이름을 확인할 수 있다. 본 절에서는 로그에 출력되는 각 모듈 이름과 이에 해당하는 실제 모듈들에 대해 설명한다.

모듈 정보모듈 이름
C_Session중앙 집중식 세션 서버
ConnectorConnector
D_Session분산식 세션 서버
Deploy애플리케이션 Deploy
EJBEJB 엔진
JMXJMX
JNDI.CommonJNDI 공통
JNDI.ContextJNDI Context
JNDI.LocalJNS(Local Naming Server)
JNLPJNLP
JNSSJNS 서버
JTMAXjtmax
MGR매니저(Manager)
Monitor 
Monitoring 
NETJEUS 네트워크
NIOJEUS 네트워크
OTS 
Scheduler스케줄러
SecutiryJEUS Security
Session 
TM트랜잭션 매니저
TMRecovery트랜잭션 매니저 recovery
UDDIUDDI
WEB서블릿 엔진
WebTWebT
WebtobLightWebtoB
WSS웹 서비스 Security
WSVC웹 서비스
XMLConverter

11.3. JEUS Logging 설정

본 절에서는 JEUS에서 Logging에 대한 설정 방법과 커스터마이즈(customization) 방법을 설명한다.

11.3.1. 로거 설정

다음은 JEUS 설정 파일에 설정 가능한 로거에 대한 설명이다.

항목설명
jeus

JEUS 시스템에서 사용하는 최상위의 로거이다.

JEUSMain.xml <node>의 <system-logging> 항목에서는 JEUS Manager JVM의 jeus 로거를 설정하고, <engine-container>의 <system-logging>은 해당 엔진 컨테이너 JVM의 jeus 로거를 설정한다. 엔진 컨테이너에서는 <engine-container>의 <system-logging>항목이 없다면 <node>의 <system-logging> 항목에서 설정한 <level>을 따르게 된다.

jeus.systemuser엔진 컨테이너의 user 로거에 해당한다. 따라서 JEUSMain.xml <engine-container>의 <user-logging>에 설정할 수 있다.
jeus.ejbEJB 엔진에서 사용하는 로거로 <node>나 <engine-container>의 <system-logging> 항목에 설정할 수 있고, 해당 EJB 엔진의 <engine-command>의 <system-logging> 항목에 설정할 수 있다.
jeus.servlet서블릿 엔진에서 사용하는 로거로 <node>나 <engine-container>의 <system-logging> 항목에 설정할 수 있고, 해당 서블릿 엔진의 <engine-command>의 <system-logging> 항목에 설정할 수 있다.
jeus.jmsJMS 엔진에서 사용하는 로거로 <node>나 <engine-container>의 <system-logging> 항목에 설정할 수 있고, 해당 JMS 엔진의 <engine-command>의 <system-logging> 항목에 설정할 수 있다.
jeus 로거의 하위 로거설정한 로거에 해당하는 서비스와 관련된 로거로 <node>나 <engine-container>의 <system-logging> 항목에 설정할 수 있다.

이들 로거 중 jeus를 제외한 다른 로거들은 설정하지 않으면 상위 로거의 핸들러(handler)를 사용해서 로그 메시지를 출력한다. 또한 jeus 로거는 설정되지 않으면 콘솔 핸들러(console handler)를 사용한다. 따라서 JEUSMain.xml에 아무런 로거 설정이 되어 있지 않다면, JEUS Manager와 모든 엔진 컨테이너의 로그 메시지가 JEUS Manager의 콘솔창으로 보이게 된다. 이때 레벨(level)은 INFO이다. jeus 로거는 기본적으로 상위 로거의 핸들러를 사용하지 않는다.

참고

엔진 컨테이너에 로거 설정을 하지 않으면 매니저에 설정한 로그 레벨을 따르게 된다. 이때 핸들러는 콘솔 핸들러이고 핸들러의 레벨은 기본값인 FINEST이다. 매니저에서 콘솔 핸들러의 레벨을 설정하였더라도 엔진 컨테이너의 콘솔 핸들러의 레벨은 FINEST로 매니저의 설정을 따르지 않는다. 매니저에 로그 설정에 따라서 콘솔창에 모든 레벨의 엔진 컨테이너 로그가 출력될 수도 있다.

다음은 로거의 설정에 예로 JEUSMain.xml의 <system-logging> 항목의 설정을 통해 Logging 설정을 할 수 있다. JEUS에서는 WebAdmin을 통해 설정하는 것을 권장한다.

[예 11.2] 로거 설정 : <<JEUSMain.xml>>

<jeus-system>
    . . .
    <node>
        <name>johan</name>
        . . .
        <engine-container>
            <name>container1</name>
            . . .
            <engine-command>
                <type>ejb</type>
                <name>engine1</name>
            </engine-command>
            <engine-command>
                <type>servlet</type>
                <name>engine1</name>
            </engine-command>
            . . .
            <!-- johan_container1 컨테이너에 로거를 설정 -->
          <system-logging>
                <!-- 컨테이너에 로거 설정이 없다면 노드에 설정한 로그레벨을 따른다. -->
                <level>INFO</level>
                <handler>
                    <file-handler>
                        <name>fileHandler</name>
                        <valid-hour>1</valid-hour>
                    </file-handler>
                </handler>
                </system-logging>

            <!-- johan_container1 컨테이너에 jeus.ejb 로거를 설정 -->
          <system-logging>
          <name>jeus.ejb</name>
                <level>FINEST</level>
            </system-logging>
            . . .
        </engine-container>
        . . .
        <!-- johan 노드(JEUS Manager)에 사용자 로거를 설정 -->
       <user-logging>
            <level>FINE</level>
            <use-parent-handlers>true</use-parent-handlers>
            <handler>
                <smtp-handler>
                    <name>smtpHandler</name>
                    <level>SEVERE</level>
                    <smtp-host-address>mail.com</smtp-host-address>
                    <from-address>jeus@mail.com</from-address>
                    <to-address>admin@mail.com</to-address>
                    <send-for-all-messages>
                        false
                    </send-for-all-messages>
                </smtp-handler>
            </handler>
        </user-logging>

        <!-- johan 노드(JEUS Manager)에 로거를 설정 -->
       <system-logging>
            <level>FINE</level>
            <handler>
                <console-handler>
                    <name>consoleHandler</name>
                    <level>INFO</level>
                </console-handler>
                <file-handler>
                    <name>fileHandler</name>
                    <level>FINE</level>
                    <valid-hour>1</valid-hour>
                </file-handler>
            </handler>
        </system-logging>

        <!-- johan 노드(JEUS Manager)에 로그 파일 Rotation기능을 설정 -->
       <system-logging>
            <level>FINE</level>
            <handler>
                <console-handler>
                    <name>consoleHandler</name>
                    <level>INFO</level>
                </console-handler>

                <file-handler>
                    <name>fileHandler</name>
                    <enable-rotation>true</enable-rotation>
                 <rotation-count>50</rotation-count>
                 <valid-size>10240</valid-size>
                 <append>false</append>
              </file-handler>
            </handler>
        </system-logging>
    </node>
    . . .
</jeus-system>

다음은 <system-logging> 하위 설정 헝목에 대한 설명이다.

항목설명
<name>로거의 이름을 설정한다. <node>나 <engine-container> 내에 이 설정이 생략된 경우에는 jeus 로거이다. <engine>내에 설정이 되어 있는 경우에는 무시한다.
<level>

로거의 레벨(level)을 설정한다. 이 레벨 이하의 메시지만 로거를 통해 출력될 수 있다.

다음 중에 하나를 설정한다.

  • SEVERE(FATAL)

  • WARNING(NOTICE)

  • INFO(INFOMATION) (기본값)

  • CONFIG, FINE(DEBUG)

  • FINER

  • FINEST

  • ALL

<use-parent-handlers>

로거가 자신의 핸들러뿐만 아니라 상위 로거의 핸들러를 사용할 것인지의 여부를 설정한다.

기본값은 true이지만 "jeus" 로거의 경우는 JEUS의 최상위 로거이기 때문에 false이다. 또한 자신의 핸들러를 설정하지 않고 이 값을 false로 설정할 경우 상위 핸들러를 사용할 수 있도록 이 값을 true로 바꿔준다.

<filter-class>로거가 로그 메시지를 핸들러에게 보내기 전에 수행하는 필터링(filtering)에 사용할 클래스를 지정한다. 여기에 지정된 클래스는 lib/application 디렉터리의 JAR 파일 내에 포함되어야 한다.
<handler>로거가 사용할 핸들러를 지정한다. 이 항목이 설정되어 있지 않다면 콘솔 핸들러(console handler)가 기본적으로 사용된다.

<handler>에는 콘솔 핸들러, 파일 핸들러, SMTP 핸들러, 소켓 핸들러, 사용자 핸들러가 있으며, 각 핸들러에 대해 다음과 같은 하위 항목들이 있다.

  • <console-handler>

    콘솔 핸들러로 화면으로 로그 메시지를 출력하는 핸들러이다.

    다음과 같은 기본적인 핸들러 설정만 가지고 있다.

    항목설명
    <name>핸들러가 툴에서 보여질 때 사용할 이름을 지정한다. 이름은 하나의 로거 내에서 유일하기만 하면 된다. 만약 지정되어 있지 않으면 클래스 이름과 Hash Code) 이름이 대체된다.
    <level>

    핸들러가 출력할 메시지의 레벨을 지정한다. 즉, 로거를 통과한 로그 메시지가 이 로거가 사용하는 각각의 핸들러에게 전달되는데, 이 핸들러의 레벨에 부합하는 로그 메시지만 이 핸들러에 의해 출력된다.

    기본값은 FINEST로 로거를 통과하는 모든 로그 메시지가 핸들러에 의해 출력되도록 되어 있다.

    <encoding>핸들러가 출력하는 문자열의 encoding을 지정한다. 기본은 system encoding으로 설정되어 있다.
    <filter-class>핸들러가 로그 메시지를 출력하기 전에 수행할 필터링에 이용되는 클래스이다. 로거의 <filter-class>와 마찬가지로 lib/application에 이 클래스를 포함한 JAR 파일이 존재해야 한다.

  • <file-handler>

    파일 핸들러로 파일로 로그 메시지를 출력하는 핸들러이다.

    <console-handler>의 설정 이외에 다음과 같은 설정을 가지고 있다.

    항목설명
    <file-name>이 핸들러가 출력할 파일의 이름을 지정한다. 절대 경로로 되어 있다면 그 경로로 파일이 생성되고 상대 경로라면 각 로거의 기본 경로를 기준으로 한 상대 경로로 인식한다. 이 설정을 하지 않으면 각 로거별로 지정된 경로로 파일을 생성해서 로그 메시지를 출력한다.
    <enable-rotation>핸들러가 로그 파일 Rotation기능을 사용할 것인지 설정한다. 기본값은 false로 Rotation기능을 사용하지 않는다.
    <rotation-count>핸들러가 로그 파일 Rotation기능을 사용할 때만 의미가 있다.
    <rotation-dir>핸들러가 로그 파일 rotation기능을 사용할 때만 의미가 있다.
    <valid-day>, <valid-hour>

    핸들러가 출력할 파일을 시간마다 따로 생성할 경우에 사용한다.

    둘 중 하나만 사용할 수 있는데, valid-day는 날짜별로, valid-hour는 시간별로 파일을 변경한다.

    valid-hour는 24의 약수(예: 3, 6)이거나 24로 나눈 나머지가 약수(예: 27, 30)인 값을 지정한다. 파일 이름의 형식은 valid-day의 경우 파일 끝에 _YYYYMMDD가 붙고, valid-hour의 경우 _YYYYMMDD_HH 가 붙는다. 이때 HH는 파일 로그의 시작 시간이다. 이 핸들러가 로그 파일 Rotation기능을 사용한다면 이 설정값의 의미가 달라진다.

    <valid-size>핸들러가 로그 파일 Rotation기능을 사용할 때만 의미가 있다.
    <buffer-size>파일로 출력할 때 사용할 버퍼(buffer)의 크기를 지정한다. 버퍼가 클수록 Logging의 성능은 좋아지지만 예상치 못한 상황으로 JEUS가 종료될 때에는 그 버퍼 크기만큼 로그가 손실된다. (기본값: 1024KB)
    <append>

    서버를 기동한 뒤 로그를 파일로 출력하려고 할 때 이미 같은 이름의 파일이 존재하면 덮어쓸지, 파일끝에 추가할지를 결정한다.

    기본값은 true로 파일 끝에 추가한다. 이 핸들러가 로그 파일 Rotation기능을 사용한다면 이 설정값의 의미가 달라진다.

  • <smtp-handler>

    SMTP 핸들러로 로그 메시지를 이메일(e-mail)로 전송하는 핸들러이다. 하나의 로그 메시지가 하나의 이메일로 전송된다.

    <console-handler>의 설정 이외에 다음과 같은 설정을 가지고 있다.

    항목설명
    <smtp-host-address>이메일을 보낼 호스트(host)의 주소를 지정한다.
    <from-address>이메일을 보내는 사람의 주소를 지정한다.
    <to-address>이메일을 받는 사람의 주소를 지정한다.
    <cc-address>이메일을 참조로 받는 사람의 주소를 지정한다.
    <bcc-address>이메일을 숨은 참조로 받는 사람의 주소를 지정한다.
    <send-for-all-messages>모든 메시지를 SMTP 핸들러로 보낼지를 결정한다. 만약 false이면 JEUS 시스템에서 이메일로 전송하기로 결정되어 있는 메시지만 이 핸들러를 사용해서 보내진다. 현재 이 설정은 jeus.systemuser 로거에만 유효하다.

  • <socket-handler>

    소켓 핸들러로 로그 메시지를 소켓(socket)으로 전송하는 핸들러이다.

    <console-handler>의 설정 이외에 다음과 같은 설정을 가지고 있다.

    항목설명
    <address>핸들러가 접속할 머신(machine)의 IP 주소를 지정한다.
    <port>핸들러 접속할 머신의 port를 지정한다.
  • <user-handler>

    사용자 핸들러로 사용자가 생성한 핸들러 클래스를 지정하는 항목이다.

    <console-handler>의 설정 이외에 다음과 같은 설정을 가지고 있다.

    항목설명
    <handler-class>사용자가 만든 핸들러의 클래스를 지정한다. 이 클래스는 lib/application 디렉터리의 JAR 파일에 포함되어 있어야 한다. 또한 이 클래스는 logging API의 java.util.logging.Handler를 상속받고 jeus.util.logging.JeusHandler를 구현해야 한다.
    <handler-property>jeus.util.logging.JeusHandler의 setProperty()에 사용되는 Map 객체에 들어갈 프로퍼티를 지정한다.
    <formatter-class>

    핸들러가 사용할 Formatter(formatter) 클래스를 지정한다. 이 클래스도 lib/application 디렉터리의 JAR 파일에 포함되어 있어야 한다. 또한 jeus.util.logging.JeusFormatter 인터페이스를 구현해야 한다.

    기본값은 jeus.util.logging.SimpleFormatter이나 밀리초(ms) 단위를 사용하려면 jeus.util.logging.SimpleMillisFormatter로 설정한다.

    <formatter-property>jeus.util.logging.JeusFormatter의 setProperty()에 사용되는 Map 객체에 들어갈 프로퍼티를 지정한다.

11.3.2. 로그 파일 Rotation 설정

JEUS는 JEUS가 시작될 때, 혹은 JEUS 운영 중에 설정한 시간이 되거나 파일사이즈를 넘으면 자동으로 이전에 Logging하던 파일의 이름은 바꾸고 새로 출력할 로그들은 원래의 로그 파일에 계속 Logging할 수 있도록 로그 파일 Rotation 기능을 제공한다.

valid-day, valid-hour, valid-size 설정에 따라 Rotation 한다. Rotation의 조건이 되는 3항목 중 아무 것도 설정되어 있지 않으면 로그 파일 사이즈가 1024KB가 되면 Logging하던 파일의 이름을 바꾸고 이 후에 Logging되는 파일은 이전에 Logging하던 파일에 새로 Logging한다.

다음은 로그 파일 Rotation에 대한 예제로 JEUSMain.xml의 <file-handler> 항목의 설정을 통해 Logging 설정을 할 수 있다. WebAdmin을 통해 설정할 수도 있다.

[예 11.3] 로그 파일 Rotation 설정 : <<JEUSMain.xml>>

<jeus-system>
    . . .
    <node>
        <name>johan</name>
        . . .
        <engine-container>
            <name>container1</name>
            . . .
            <!-- johan_container1 컨테이너에 로그 파일 Rotation기능을 설정 -->
          <system-logging>
                <level>FINE</level>
                <handler>
                    <console-handler>
                        <name>consoleHandler</name>
                        <level>INFO</level>
                    </console-handler>

                    <file-handler>
                        <name>fileHandler</name>
                        <enable-rotation>true</enable-rotation>
                        <rotation-count>50</rotation-count>
                        <valid-hour>1</valid-hour>
                        <append>false</append>
                 </file-handler>
                </handler>
            </system-logging>
        </engine-container>
        . . .
        <!-- johan 노드(JEUS Manager)에 로그 파일 Rotation기능을 설정 -->
       <system-logging>
            <level>FINE</level>
            <handler>
                <console-handler>
                    <name>consoleHandler</name>
                    <level>INFO</level>
                </console-handler>

                <file-handler>
                    <name>fileHandler</name>
                    <enable-rotation>true</enable-rotation>
                    <rotation-count>50</rotation-count>
                    <valid-size>10240</valid-size>
                    <append>false</append>
              </file-handler>
            </handler>
        </system-logging>
    </node>
    . . .
</jeus-system>


<file-handler> 의 하위 항목 중 로그 파일 Rotation과 관련된 설정 다음과 같다.

항목설명
<enable-rotation>

핸들러가 로그 파일 Rotation기능을 사용할 것인지 설정한다. (기본값: false, rotation기능을 사용하지 않음)

로그 파일 Rotation기능을 사용하게 되면 파일에 로그를 출력할 때 하나의 파일에만 출력하고 valid-day나 valid-hour, valid-size 중 하나의 설정에 따라서 파일 이름이 바뀌게 되고 그 이후에 출력되는 로그에 대해서는 다시 처음에 Logging을 하던 파일에 새로 출력이 된다.

enable-rotation을 true로 설정하고 valid-day나 valid-hour, valid-size를 설정하지 않으면 기본적으로 valid-size의 값이 1024KB로 동작하게 되고 로그 파일 사이즈가 1024KB가 되면 원래 Logging하던 파일 이름 뒤에 인덱스를 붙여서 새로운 이름으로 바뀌게 된다.

<rotation-count>핸들러가 Rotation을 한 백업 로그 파일을 몇 개나 보관할지 여부를 설정한다.
<Rotation-dir>핸들러가 Rotation을 한 백업 로그 파일을 어디에 저장할지를 설정한다. 기본값은 현재 파일 Logging을 하고 있는 디렉터리이다.

<valid-day>,

<valid-hour>

핸들러가 출력한 로그 파일을 정해진 시간이 되면 로그 파일의 이름을 바꾼다.

둘 중 하나만 사용할 수 있는데, valid-day는 날짜별로, valid-hour는 시간별로 파일을 변경한다.

valid-hour는 24의 약수(예: 3, 6)이거나 24로 나눈 나머지가 약수(예: 27, 30)인 값을 지정한다. 바뀔 파일 이름의 형식은 valid-day의 경우 파일 끝에 _YYYYMMDD가 붙고, valid-hour의 경우 _YYYYMMDD_HH 가 붙는다. 이때 HH는 로그 파일에 마지막으로 Logging한 시간이다.

<valid-size>

핸들러가 출력한 로그 파일이 정해진 사이즈가 되면 로그 파일의 이름을 바꾼다.

바뀔 파일 이름의 형식은 파일 끝에 '_xxxxx'가 붙는다. 이때 xxxxx는 1부터 99999까지의 정수이다. 기본값은 1024KB로 로그 파일 Rotation기능을 사용하고 valid-day나 valid-hour, valid-size의 설정값이 없을 때 이 값으로 동작한다.

<append>서버를 기동한 뒤 로그를 파일로 출력하려고 할 때 이미 같은 이름의 파일이 존재하면 이전에 Logging하던 파일의 이름을 valid-day, valid-hour, valid-size 설정에 따라 바꾸고 앞으로 Logging하게 될 로그 메시지는 계속 하나의 파일에만 출력한다. (기본값: true, 아직 설정한 조건이 되지 않았으면 파일 끝에 추가)

11.3.3. 표준 출력과 표준 에러를 로그 형식으로 출력 설정

JEUS에서는 표준 출력과 표준 에러를 JEUS 로그 형식으로 출력하는 기능을 제공한다. JEUS에서 기본으로 사용하는 포맷을 이용하여 JEUS 로거와 비슷한 형식으로 표준 출력와 표준 에러를 출력할 수 있다.

다음은 표준 출력과 표준 에러를 JEUS 로그 형식으로 출력하는 예제로 JEUSMain.xml에 <log-stdout-to-raw-format> 항목을 설정한다.

[예 11.4] 표준 출력과 표준 에러를 JEUS 로그 형식으로 출력 : <<JEUSMain.xml>>

<jeus-system>
    <node>
        . . .
        <log-stdout-to-raw-format>true</log-stdout-raw-format>
        <engine-container>
            . . .
            <log-stdout-to-raw-format>false</log-stdout-raw-format>
        </engine-container>
    </node>
</jeus-system>

항목설명
<log-stdout-to-raw-format>

표준 출력과 표준 에러 메시지를 raw format 그대로 출력할지 로그 형식으로 출력할지를 설정한다.

엔진 컨테이너의 경우에 해당 설정이 없으면 매니저의 설정을 따른다.

(기본값: true, raw format 그대로 출력)

이 기능을 사용하면 표준출력은 다음과 같은 포맷으로 출력된다.

  • [시간] [레벨] [버전] [Logging되는 스레드 정보] [STDOUT/STDERR] 메시지

    구분설명
    시간'년.월.일 시간:분:초'의 형식으로 출력된다.
    레벨로그 레벨이 매핑되는 숫자로 출력된다. 모두 SEVERE로 0으로 표시된다.
    버전JEUS의 빌드 버전을 표시한다.
    Logging되는 스레드 정보Logging하는 프로세스(노드 또는 컨테이너 이름)와 스레드 번호로 표현되며, 이 둘은 하이픈('-')으로 구분된다. 스레드 정보가 같은 로그는 같은 스레드에서 Logging한 메시지이다.
    STDOUT/STDERR
    • STDOUT: Logging하려는 메시지가 표준 출력인 경우

    • STDERR: Exception과 같은 표준 에러인 경우

    • UNKNOWN: 알 수 없는 경우

    메시지System.out이나 System.err를 통해 출력할 메시지이다.

11.3.4. 동적으로 Logging 레벨 설정

콘솔 툴(jeusadmin)이나 WebAdmin을 통해서 런타임(runtime)에 동적으로 설정을 변경할 수 있다.

  • jeusadmin

    loglevel 명령어를 사용하여 Logging 설정을 동적으로 변경할 수 있다.

    johan>loglevel -con johan_container1 jeus.ejb FINE

    위의 예제는 loglevel 명령어를 사용하여 johan_container1에 있는 jeus.ejb의 로거 레벨을 FINE으로 변경하는 것을 보여주고 있다. 이 명령어에 대한 자세한 내용은 "JEUS Reference Book"의 jeusadmin commands를 참고한다.

  • WebAdmin

    로그 설정 페이지에서 Logging 설정을 동적으로 변경할 수 있다.

11.3.5. 프로퍼티 설정

  • 시스템 프로퍼티 설정

    XML 설정이 불가능한 경우에 시스템 프로퍼티로 설정할 수 있다.

    • Standalone 클라이언트에서 로거 설정을 할 경우

    • XML에서 설정이 불가능한 세부 로거 설정을 할 경우(예: -Djeus.transaction.log.level = FINE)

  • Logging 프로퍼티 파일

    JEUS나 Java Logging 프로퍼티 파일에 Logging 설정을 할 수 있다.

    • JEUS Logging 프로퍼티(jeuslogging.properties) 파일

      -Djeus.logging.propertyfile로 프로퍼티 파일 경로를 지정할 수 있다. (기본 경로: JEUS_HOME\config\jeuslogging.properties)

      참고

      JEUS Logger를 밀리초 단위로 설정하려면 프로퍼티 파일 안에 'jeus.formatter=jeus.util.logging.SimpleMillisFormatter'를 추가한다.

    • Java Logging 프로퍼티(logging.properties) 파일

      -Djava.util.logging.config.file로 프로퍼티 파일 경로를 지정할 수 있다.

      (기본 경로: JEUS_HOME\bin\logging.properties)

레벨 설정 우선 순위

JEUS 툴을 이용한 동적 설정을 제외한 나머지 설정들의 레벨 설정 우선순위는 다음과 같다.

  1. 시스템 프로퍼티

  2. JEUS Logging 프로퍼티(jeuslogging.properties) 파일

  3. Java Logging 프로퍼티(logging.properties) 파일

  4. XML(JEUSMain.xml) Logging 설정

참고

핸들러에 설정한 로그 레벨은 위에서 언급한 설정 우선 순위를 치환(Override)하는 것은 아니다. 하지만 최종적으로 핸들러를 통해서 로그가 출력되기 때문에 가장 높은 순위에 있다고 할 수 있다. 참고로 핸들러의 기본 로그 레벨은 FINEST이다.