Logging

본 장에서는 JEUS 로깅(Logging) 시스템에 대해 JEUS의 로거 구조 및 각 로거와 핸들러를 설정하는 방법, 로그 메시지의 내용에 대해서 설명한다.

1. 개요

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

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

JEUS 로거 시스템은 Java SE Logging API를 기반으로 구현되었기 때문에 개발자는 이 API를 통해 JEUS 로깅 시스템을 Customize할 수 있다.

JEUS 로거의 종류는 JEUS Launcher와 JEUS 서버, 그리고 WEB 엔진에서 사용되는 액세스 로그가 있다. 각 로거는 "jeus 로거"(여기서 "jeus"는 로거의 이름, 이하 jeus 로거)를 기준으로 생성되어 있다. JEUS 서버는 모두 "jeus 로거"를 기본적으로 생성한다. 하위에 생기는 여러 가지 모듈들은 jeus.ejb 등과 같이 jeus 하위의 로거를 생성해서 사용한다.

"jeus 로거"는 JEUS에서 사용되는 최상위 로거의 이름이다. 사용자가 설정하지 않아도 이 로거는 기본적으로 존재한다.

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

  • jeus 로거

  • user 로거

  • 웹 엔진에서 사용하는 액세스 로거

  • jeus 로거의 하위 로거

  • Java 로거

핸들러는 실제 로거에서 출력하려는 로그 메시지를 어떤 대상을 통해 기록하는 역할을 한다. 따라서 로거는 항상 핸들러를 동반한다. JEUS에서는 로그 메시지의 출력 대상에 따라 다음의 4가지 종류의 로거에 핸들러(handler)를 설정할 수 있고, 설정된 핸들러를 통해 로그 메시지가 기록된다. 이 중 가장 보편적으로 사용하는 것이 파일 핸들러(File Handler) 이다.

구분 설명

파일 핸들러

로거를 통해 로깅되는 로그 메시지를 파일에 기록한다.

SMTP 핸들러

로그 메시지를 메일을 통해 기록한다.

소켓 핸들러

로그 메시지를 지정한 IP를 통해 기록한다.

user 핸들러

사용자가 작성한 핸들러를 통해 로그 메시지를 기록한다.

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

버전별 주요 변경사항

다음은 각 버전별 주요 변경사항에 대한 설명이다.

  1. JEUS 6까지는 콘솔 핸들러도 설정이 가능했지만 JEUS 7부터는 설정할 수 없다.

  2. JEUS 7부터는 서버 프로세스의 콘솔은 존재하지 않는다. Launcher를 통해 서버를 부팅하기 때문에 Launcher 프로세스의 콘솔이지 서버 프로세스의 콘솔은 아니다.

    서버에서 발생하는 로그 메시지들을 콘솔로 출력하기 위해서는 Launcher 프로세스가 서버가 shutdown될 때까지 다운되지 않아야 한다. 서버를 띄울 때 -verbose 옵션을 주고 띄우면 Launcher 프로세스는 서버가 다운될 때까지 다운되지 않고 서버에서 발생하는 로그 메시지들을 파이프를 통해 읽어 콘솔로 출력한다.

  3. JEUS 7 Fix#4 버전부터 Asynchronous logging를 지원한다. 로깅을 log를 호출한 worker thread에서 처리하지 않고 전담 logger thread에서 처리함으로서 JEUS 전체적인 성능의 향상을 위함이다. 이 방식에서는 로깅이 지연될 수 있는 파일 핸들러 외의 나머지 핸들러는 지원하지 않는다. 만약 나머지 핸들러들을 쓰고 싶다면 jeus.logging.useAsync 옵션을 false로 설정한다. 또한 Asynchronous logging 방식에서는 jeus.access.logging.skip.when.busy 옵션을 true로 함으로서 성능에 민감한 web worker가 현재 로깅이 밀려있어 기다리게 되는 현상을 자동으로 detect하여 access logger만큼은 기다리지 않고 넘어갈 수 있도록 지원한다.

  4. JEUS 8.5 버전부터 Asynchronous logger의 예외상황이 발생하는 경우에 이를 기록할 수 있는 Status logger를 도입한다.

    Asynchronous logger로 로깅 작업 시에 문제가 발생했을 때에 원인을 찾을 수 있도록 하기 위함이다. 사용자가 별도로 설정할 수 없으며, 기본값으로 파일 핸들러(FileHandler)를 통해 문제 발생 시에 JeusLoggerStatus.log 파일에 문제 상황에 대해 로그를 기록한다. Asynchronous logger에 문제 상황이 발생하지 않는다면 JeusLoggerStatus.log 파일도 생성되지 않는다.

  5. JEUS 8.5 버전부터 Pattern formatting을 지원해서 로깅 시에 출력할 로그의 포맷을 사용자가 지정할 수 있도록 한다.

    JEUS의 서버 로그에 적용되며 총 8가지의 형식 문자열(%d, %l, %J, %T, %c, %M, %N, %m)을 지원한다. 사용자는 형식 문자열과 일반 문자를 조합하여 원하는 로깅 패턴을 설정할 수 있다(단, 형식문자열의 식별을 위하여 '%' 문자는 로깅 패턴에 포함시킬 수 없다).

    JEUS 이전 버전에서 지원했던 SimpleFormatter와 SimpleMillisFormatter 또한 형식문자열과 문자열의 조합인 로깅 패턴으로 동일하게 출력할 수 있다.

    • SimpleFormatter

      [%d{yyyy.MM.dd HH:mm:ss}][%l] [%J-%T] [%M-%N] %m
    • SimpleMillisFormatter

      [%d{yyyy.MM.dd HH:mm:ss:SSS}][%l] [%J-%T] [%M-%N] %m

      로깅 패턴의 기본값은 기존의 SimpleFormatter와 동일한 패턴의 로그를 출력하는 로깅 패턴으로 되어 있다. 형식 문자열 등 자세한 설정은 로거 정보 확인에서 설명한다.

  6. JEUS 21 버전부터 Asyncronous logger의 이벤트를 저장하기 위한 버퍼의 사이즈와 버퍼에 로그 이벤트가 없을 때 컨슈머가 사용할 대기 전략을 시스템 프로퍼티로 지정할 수 있다.

    로그 이벤트의 양이 많다면 jeus.logging.async.bufferSize를 늘려서 이벤트 버퍼가 더 많은 이벤트를 수용할 수 있도록 할 수 있다. 기본값은 2048이며, 최대 262144까지 가능하다.

    로그 이벤트 컨슈머의 대기 전략은 jeus.logging.async.waitStrategy를 통해 설정 가능하고, 기본값은 block이고 별도로 sleep, yield, busyspin, timeout을 지원한다.

  7. JEUS 9 버전부터 각 서버의 log-home, File Handler의 rotation-dir 경로 설정 시 경로에 환경 변수 및 시스템 프로퍼티를 포함시킬 수 있다. 단, 변수 이름은 ${VAR}과 같은 형태로 명시되어 있어야 한다.

2. JEUS 로거 기본 구조

본 절에서는 로거를 사용하기 위한 기본 개념을 설명하고 실제 설정 방법에 대해서 설명한다.

2.1. 개요

서버에 로거를 설정하지 않아도 최상위 로거인 jeus 로거는 기본적으로 존재한다. 파일 핸들러(File Handler)를 사용하고 매일 로그 파일이 로테이션될 수 있도록 한다. 로그 로테이션을 비롯한 파일 핸들러에 대한 자세한 내용은 로거 정보 확인에서 설명한다.

jeus 로거는 로거 삭제 명령으로 삭제할 수 없다. jeus 로거를 삭제하면 다른 로거를 설정하지 않은 경우 서버에 아무런 로그 메시지도 로깅되지 않기 때문에 운영상 문제가 될 수 있다. 만약 서버에서 로거를 남기고 싶지 않다면 jeus 로거의 레벨을 OFF로 설정해야 한다.

도메인에 등록된 서버의 삭제 역시 해당 서버의 logs 디렉터리 삭제를 의미하지는 않는다. 로거는 관리자가 언제든지 열람할 수 있는 중요한 정보이기 때문에 필요없다고 판단하여 지우는 역할은 관리자의 몫이다.

로그 디렉터리 구조

로거에서 파일 이름을 별도로 지정하지 않았다면 JEUS에서는 정해진 위치에 로그 파일들을 생성한다. 로그 디렉터리의 구조는 다음과 같다.

SERVER_HOME
  |--logs
       |--servlet
       |      |--access.log
       |--JeusLauncher.log
       |--JeusServer.log
       |--JeusLoggerStatus.log
       |--jvm.log

다음은 로그 디렉터리에 기본적으로 생성되는 로그 파일에 대한 설명이다.

servlet/access.log

웹 애플리케이션 요청에 대한 액세스 로그 파일이다. 기본적으로 서버의 모든 웹 애플리케이션으로 요청한 내용이 기록된다. 웹 엔진에 가상 호스트가 설정되어 있다면 servlet 디렉터리 하위에 가상 호스트 이름으로 디렉터리가 생성되고 그 하위에 access.log 파일을 생성하여 가상 호스트로 요청된 정보들이 로깅한다.

JeusLauncher.log

Launcher에서 서버 기동을 위해 남기는 정보와 서버를 부팅할 때 발생하는 로그 메시지를 로깅한다.

JeusServer.log

서버에서 로깅하는 기본 로그 파일이다. 서버에 로거관련 설정을 하지 않았다면 jeus 로거를 포함한 하위 모든 로거에 대한 기본 로그 파일이 된다.

JeusLoggerStatus.log

JEUS 7 Fix4부터 기본으로 설정되는 Asynchronous logger(서버 로거)의 로깅 중 예외를 기록하는 로그 파일이다. Asynchronous logger가 정상적으로 동작한다면 생기지 않지만 예외 상황이 발생하면 해당 예외를 로깅하며 생성된다.

jvm.log

서버 JVM에서 발생하는 gc 로그나 Thread Dump 등이 기록된다. Launcher에서 서버를 시작할 때 특정 JVM 옵션을 넣기 때문에 생성되는 파일이다.

Launcher에서 서버를 시작할 때 JVM 옵션에 다음을 추가한다.

-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=SERVER_HOME/logs/jvm.log

JVM 로그를 별도의 파일에 기록하도록 설정하는 이유는 서버가 백그라운드 프로세스로 동작하면서 서버의 Thread Dump가 더 이상 콘솔에 남지 않기 때문이다. 이 로그의 위치를 변경하려면 -XX:LogFile 옵션을 서버의 JVM 옵션에 추가해주면 기본 설정이 무시되고 사용자의 설정을 따른다.

사용자 정의 gc log file

Oracle의 경우 "-Xloggc:", IBM의 경우 "-Xverbosegclog:" 옵션을 사용하여 gc log file을 지정할 수 있다. 이때 JEUS에서는 지정된 파일 뒤에 자동으로 time stamp를 붙여서 JEUS를 띄울 때마다 생기는 gc log file을 구별할 수 있는 옵션을 제공한다.(기본값) 만약 time stamp를 붙이고 싶지않다면 기동 스크립트에 -Djeus.logging.gclog.timestamp.on=false 라는 JVM 옵션을 추가한다.

특정 로그 디렉터리 설정

서버에서 생성하는 모든 로그(Rotation Backup 로그 포함)들을 특정 디렉터리에 저정하고 싶다면 domain.xml을 편집해야 하며 <server> 태그 하위에 <log-home> 태그를 통해서 경로를 설정할 수 있다.

<servers>
        <server>
            <name>server1</name>
            <node-name>node1</node-name>
            <log-home>${LOG_HOME}/logs</log-home>
                ...

log-home 경로에 시스템 환경 변수나 시스템 프로퍼티의 값을 넣을 수 있다. 이때 변수명은 ${ENV_NAME}와 같은 패턴이어야 하며, 등록되지 않은 환경 변수를 사용할 경우 디폴트 경로에 로그가 생성된다.

2.2. Launcher 로거

Launcher는 서버를 기동하기 위해 사용되는 프로세스이다. 실행 스크립트나 명령어를 통해 서버를 기동시키면 Launcher 프로세스가 실행되고, Launcher에서는 설정 파일을 읽고 실제 서버를 시작시킨다. Launcher에서는 서버가 부팅되면서 발생하는 로그 메시지를 JeusLauncher.log 파일과 콘솔에 남긴다. Launcher 프로세스는 일반적으로 서버가 부팅을 완료하면 종료하여 서버의 부팅 로그만 Launcher 로거를 통해 남긴다. 하지만 서버를 실행할 때 -verbose 옵션을 주었다면 Launcher 프로세스는 서버의 부팅이 완료된 후에도 종료되지 않고 서버가 다운될 때까지 남겨지는 모든 로그 메시지를 Launcher의 콘솔과 파일을 통해 남긴다.

서버에서 서버 로거를 통해 로깅하고 있는 로그 메시지들을 Launcher 프로세스에서 별도로 로깅하는 이유는 서버 부팅 중에 서버에서 로깅을 할 수 없는 상황에서 발생할 수 있는 오류 때문이다. 예를 들어 설정 파일 오류 등의 이유로 서버를 기동시키지 못했거나, 서버가 기동은 되었지만 부팅 실패로 인해 서버의 로거가 초기화되기 전에 종료되었다면 부팅 실패의 원인을 알 수 있는 로그 메시지들이 서버 로거를 통해 남을 수가 없다. 따라서 Launcher에서는 서버의 부팅 로그를 Launcher 자신의 로거를 통해 남겨서 사용자가 Launcher 로그를 확인하여 서버가 부팅할 때 발생한 오류를 해결할 수 있도록 한다. Launcher에 대한 자세한 내용은 JEUS Server 안내서의 Launcher를 참고한다.

다음은 설정 파일 오류로 인한 부팅에 실패할 때 Launcher에서 남긴 로그 메시지의 예이다.

[2016.08.24 12:38:52][0] [launcher-1] [XmlValidationEventHandler] [FATAL_ERROR]
Invalid content was found starting with element <system-clustering-framework>
(of parent element <domain>). One of '{password-validator, admin-server-name}'
is expected.

[2016.08.24 12:38:52][0] [launcher-1] [SERVER-0522] An exception occurred while processing [domain.xml].
<<__Exception__>>
jeus.xml.binding.JeusJAXBException: Unmarshalling the XML descriptor failed:
domain.xml
class org.xml.sax.SAXParseException :
cvc-complex-type.2.4.a: Invalid content was found starting with element
'system-clustering-framework'. One of '{"http://www.tmaxsoft.com/xml/ns/jeus":password-validator,
"http://www.tmaxsoft.com/xml/ns/jeus":admin-server-name}' is expected..
  at jeus.xml.binding.BindingHelper.getDescriptor(BindingHelper.java:96)
  at jeus.service.descriptor.DescriptorFile.getDeploymentDescriptor(DescriptorFile.java:210)
  at jeus.service.descriptor.JEUSDomainDescriptorFile.getConfigDescriptor(JEUSDomainDescriptorFile.java:54)
  at jeus.launcher.Launcher.initDomainType(Launcher.java:222)
  at jeus.launcher.Launcher.readDescriptor(Launcher.java:210)
  at jeus.launcher.Launcher.start(Launcher.java:105)
  at jeus.launcher.Launcher.main(Launcher.java:58)

2.3. 서버 로거

서버가 운영되는 동안 발생하는 로그 메시지를 로깅한다. 각 로그 메시지들은 서버가 운영 중에 하는 작업들에 대한 정보를 함축적으로 나타낸다.

JEUS의 기본 로거는 최상위 로거인 jeus 로거이고, jeus 로거의 하위 로거들은 jeus 로거의 핸들러를 통해 로깅된다. 서버에서 로깅되는 로거는 동적으로 추가, 삭제, 변경이 가능하다. 핸들러 역시 동적 추가, 삭제, 변경이 가능하다.

로그 메시지의 포맷은 formatter pattern을 통해 변경 가능하다. 아무런 설정이 없다면 다음과 같은 형태로 출력되는 JEUS에서 제공하는 기본 포맷 패턴인 '[%d{yyyy.MM.dd HH:mm:ss}][%l] [%J-%T] [%M-%N] %m’가 사용된다.

이전 버전에서 지원했던 포매터인 SimpleFormatter와 SimpleMillisFormatter의 로깅 패턴은 다음과 같다.

  • SimpleFormatter

    [%d{yyyy.MM.dd HH:mm:ss}][%l] [%J-%T] [%M-%N] %m
  • SimpleMillisFormatter

    [%d{yyyy.MM.dd HH:mm:ss:SSS}][%l] [%J-%T] [%M-%N] %m

다음은 서버 로거의 형식에 대한 설명이다.

  • 로그 형식

    [%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] %m
    항목 설명

    %d{yyyy.MM.dd HH:mm:ss}

    로그 이벤트의 날짜를 출력한다. 뒤에 '{}' 에 추가하는 DATE_FORMAT에는 출력하고자하는 날짜의 형식을 입력한다. DATE_FORMAT의 Formatting 방식은 JDK의 SimpleDateFormat 방식을 따른다.

    %l

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

    • 0 : SEVERE

    • 1 : WARNING

    • 2 : INFO

    • 3 : CONFIG

    • 4 : FINE

    • 5 : FINER

    • 6 : FINEST

    • 7 : ALL

    %J

    로그 메시지를 로깅하는 프로세스가 출력된다. Thread 정보를 나타낸다.

    %T

    로그 메시지를 로깅하는 Thread 번호가 출력된다. Thread 정보가 같은 로그 메시지는 같은 Thread에서 로깅한 것이다.

    %M

    로그를 출력하는 모듈의 이름이 출력된다. 각 모듈에 해당하는 이름은 로그 메시지 모듈 이름을 참고한다.

    %N

    출력되는 로그 이벤트의 메시지 번호를 출력한다.

    %m

    운영 중에 발생한 일에 대한 의미를 함축하고 있는 로그 메시지이다.

    %c

    로그 메시지를 로깅하는 로거의 이름을 출력한다.

Launcher 프로세스에서 로깅되는 로그 메시지는 별도로 설정할 수 없으며 기본 formatter pattern을 따른다.

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

[2024.09.25 16:01:33][2] [ms1-1] [SERVER-0248] The JEUS server is STARTING.
[2024.09.25 16:01:34][0] [ms1-1] [SERVER-0000] Version information - JEUS 9 (9.0.0.0-b15).
[2024.09.25 16:01:34][0] [ms1-1] [SERVER-0001] java.specification.version=[17], java.runtime.version=[17.0.2+8-86], vendor=[Oracle Corporation]
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0003] os.name=[linux], os.arch=[amd64], os.version=[4.18.0-408.el8.x86_64]
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0002] Domain=[domain1], Server=[ms1], baseport=[19736], pid=[17004]
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0004] The current system time zone : 한국 표준시
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0571] All JEUS system properties have been confirmed.
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0568] Service address='0.0.0.0:19736', hostname='JEUS-PC', representation ip='192.168.1.105'
[2024.09.25 16:01:34][2] [ms1-1] [SERVER-0561] The default RMI export port = 19743 and bind address = JEUS-PC/192.168.1.105.
[2024.09.25 16:01:34][2] [ms1-1] [NET-0002] Beginning to listen to NonBlockingChannelAcceptor: 0.0.0.0:19736.

우선, 첫 번째 로그 메시지는 2024년 9월 25일 오후 4시 1분 33초에 출력된 레벨 2(INFO 레벨)의 메시지라는 것을 알려준다. 이 로그 메시지는 ms1라는 서버에서 1번 Thread에 의해 로깅되었고, SERVER 모듈의 0248번 메시지가 출력되었음을 알 수 있다. 실제 이 로그 메시지는 JEUS 서버가 부팅을 시작했음을 알리는 서버의 최초 메시지이다.

다른 로그 메시지들 역시 첫 번째 메시지와 같은 프로세스에서 로깅되고, SERVER 모듈의 메시지가 출력된 것을 알 수 있다. 위 로그 메시지들은 서버가 부팅할 때 발생하는 것으로 JEUS 버전, Java 버전, 프로세스 ID, TimeZone, 네트워크 정보와 같은 환경 정보를 출력하고 있다.

JEUS에서는 서버 로거의 formatter pattern으로 기본 포맷 패턴으로 [%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] %m 이 설정되어있다. 이전 버전에서 SimpleFormatter가 출력하는 포맷 패턴이며 이전 버전에서 SimpleFormatter와 함께 제공했던 SimpleMillisFormatter의 포맷 패턴은 [%d{yyyy.MM.dd HH:mm:ss:SSS}] [%l] [%J-%T] [%M-%N] %m 이다.

다음은 SimpleMillisFormatter와 동일한 로그 형식을 출력하는 포맷 패턴을 설정했을 때 발생하는 로그 메시지의 예이다. 포맷터 설정에 대한 자세한 내용은 로깅 설정을 참고한다.

[2024.09.25 16:01:33][2] [ms1-1] [SERVER-0248] The JEUS server is STARTING.
[2024.09.25 16:01:34:385][0] [ms1-1] [SERVER-0000] Version information - JEUS 9 (9.0.0.0-b15).
[2024.09.25 16:01:34:385][0] [ms1-1] [SERVER-0001] java.specification.version=[17], java.runtime.version=[17.0.2+8-86], vendor=[Oracle Corporation]
[2024.09.25 16:01:34:386][2] [ms1-1] [SERVER-0003] os.name=[linux], os.arch=[amd64], os.version=[4.18.0-408.el8.x86_64]
[2024.09.25 16:01:34:387][2] [ms1-1] [SERVER-0002] Domain=[domain1], Server=[ms1], baseport=[19736], pid=[17004]
[2024.09.25 16:01:34:387][2] [ms1-1] [SERVER-0004] The current system time zone : 한국 표준시
[2024.09.25 16:01:34:560][2] [ms1-1] [SERVER-0571] All JEUS system properties have been confirmed.
[2024.09.25 16:01:34:568][2] [ms1-1] [SERVER-0568] Service address='0.0.0.0:19736', hostname='JEUS-PC', representation ip='192.168.1.105'
[2024.09.25 16:01:34:580][2] [ms1-1] [SERVER-0561] The default RMI export port = 19743 and bind address = JEUS-PC/192.168.1.105.
[2024.09.25 16:01:35:030][2] [ms1-1] [NET-0002] Beginning to listen to NonBlockingChannelAcceptor: 0.0.0.0:19736.

2.4. 액세스 로거

액세스 로거는 사용자의 애플리케이션 요청이 어떻게 처리되는지를 남기기 위한 용도로 사용된다. 웹 애플리케이션으로의 요청에 대한 정보가 기록된다. 본 절에서는 웹 엔진에서의 액세스 로거에 대해 설명한다.

웹 엔진에서의 액세스 로거

웹 엔진 액세스 로거는 웹 엔진이 처리한 모든 요청을 기록한다. 액세스 로거로 기록되는 로그는 웹 애플리케이션에 접근한 정보와 기록할 내용을 지정하여 관리자가 필요한 정보를 얻을 수 있다. 웹 엔진으로 요청이 들어와 해당 요청을 모두 처리하고 그 응답을 보낸 후 액세스 로거는 설정된 정보를 기록한다.

웹 엔진 액세스 로거로 기록되는 로그들은 기본적으로 공통 로그 형식(Common Log Format)을 지원한다. 이 형식은 Apache와 같은 많은 곳에서 공통으로 사용하고 있으므로 로그를 액세스 분석하는 데 많은 정보를 얻을 수 있다. 특히 로그 분석 도구의 경우 공통 로그 형식을 분석하는 도구들이 많이 있으므로 이 도구들을 이용하면 웹 엔진의 액세스 로그를 분석하는 데 큰 도움이 된다.

JEUS 6까지는 공통 로그 형식을 지원하지 않았다.

그리고 웹 엔진의 경우 가상 호스트를 설정할 수 있는데 가상 호스트를 설정한 경우 가상 호스트별로 액세스 로거를 설정해서 별도의 액세스 로그를 수집할 수 있다. 이때 가상 호스트의 액세스 로그는 다음의 파일명으로 남게 된다.

SERVER_HOME/logs/servlet/<가상 호스트명>/access.log

웹 엔진 액세스 로그의 기본 형식으로 액세스 로그를 남겼다면 다음과 같은 로그들이 access.log에 남는다.

192.168.15.57 [29/Aug/2016:17:37:02 +0900] "GET /example/test1.jsp HTTP/1.1" 200 5 38

위 로그는 192.168.15.57 IP로부터 /example/test1.jsp 요청의 결과 정상적으로 38Byte의 응답을 29/Aug/2016:17:37:02 +0900 시간에 보냈다는 것을 의미한다. 보다 자세한 로그 형식은 공통 로그 형식에 대한 문서를 참고한다.

기록되는 로그의 형식을 바꾸거나 그 외의 웹 엔진 액세스 로거의 설정에 대한 자세한 내용은 JEUS Web Engine 안내서의 액세스 로그 기본 설정을 참고한다.

2.5. 사용자 로거

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

2.6. 로거 리스트

다음은 로거 목록에 대한 설명이다.

  • EJB 관련

    구분 설명

    jeus.ejb.bean

    EJB Home/Object Stub 관련 로거

    jeus.ejb.cluster

    EJB 클러스터링 관련 로거

    jeus.ejb.compiler

    EJB Stub Compiler 관련 로거

    jeus.ejb.connector

    MDB와 리소스 어댑터 관련 로거

    jeus.ejb.container

    EJB 컨테이너 관련 로거

    jeus.ejb.ejbserver

    EJB 엔진 관련 로거

    jeus.ejb.interop

    EJB CORBA 연동 관련 로거

    jeus.ejb.persistence

    CMP 관련 로거

    jeus.ejb.schema

    EJB QL 관련 로거

    jeus.ejb.timer

    EJB Timer 관련 로거

    jeus.ejb.transaction

    EJB Transaction & Synchronization 관련 로거

    jeus.ejb.webserver

    EJB Class FTP 관련 로거

    jeus.ejb.util

    기타 로거

  • JPA 관련

    구분 설명

    jeus.persistence

    JPA 모듈의 최상위 로거

    jeus.persistence.provider

    TopLink Essentials(default provider)의 최상위 로거

    jeus.persistence.container

    JPA에 대한 컨테이너 로거

  • Servlet 관련

    구분 설명

    jeus.servlet.common

    Servlet 공통 모듈 관련 로거

    jeus.servlet.connection

    Connector 관련 로거

    jeus.servlet.connector

    NIO Connector 관련 로거

    jeus.servlet.deployment

    Deploy 관련 로거

    jeus.servlet.engine

    Servlet 주요 처리 과정 관련 로거

    jeus.servlet.filter

    필터 관련 로거

    jeus.servlet.jsp

    JSP 관련 로거

    jeus.servlet.listener

    Servlet Listener 관련 로거

    jeus.servlet.loader

    클래스 로더 관련 로거

    jeus.servlet.property

    프로퍼티 관련 로거

    jeus.servlet.servlets

    JEUS에서 제공하는 Servlet 관련 로거

    jeus.servlet.util

    유틸리티에서 사용하는 로거

    jeus.websocket

    websocket 서버에 대한 모든 로거

    jeus.webserver

    Class FTP 서비스에서 사용하는 로거

  • Session Manager 관련

    구분 설명

    jeus.session

    Session Manager의 최상위 로거, 공통적으로 사용되는 로거

    jeus.session.distributed

    분산식 Session Manager의 로거

  • 웹 서비스 관련

    • JAX-RPC/SAAJ 로거

      구분 설명

      jeus.webservices.client

      jeus.webservices.client 패키지(client invocation framework) 관련 로거

      jeus.webservices.encoding

      SOAP serialize/deserialize 관련 로거

      jeus.webservices.message

      SAAJ 및 SOAP 메시지 관련 로거

      jeus.webservices.wsdl

      WSDL 처리 관련 로거

      jeus.webservices

      그 외 웹 서비스 관련 로거

    • UDDI 로거

      구분 설명

      jeus.uddi.datastore

      DB 프로세싱 관련 로거

      jeus.uddi.function

      UDDI API 메시지 프로세싱 관련 로거

      jeus.uddi.judy

      Registry Server Engine 관련 로거

      jeus.uddi.registry

      Transport layer, Reqeust/Response 프로세싱, Registry 엔진 관련 로거

    • WS-* 로거 (JAX-RPC 기반)

      구분 설명

      jeus.webservices.wss

      ws-security 관련 로거

    • 기타

      구분 설명

      jeus.xml.binding.webservicesHelper

      EWS(JSR109)에 사용되는 DD 바인딩 관련 로거

  • 트랜잭션 관련

    구분 설명

    jeus.transaction

    트랜잭션 매니저 전반적으로 사용하는 로거

    jeus.transaction.logging

    Recovery에 사용되는 Resource Factory 관련 로거

    jeus.transaction.ots

    OTS 관련 로거

    jeus.transaction.recovery

    트랜잭션 Recovery 작업 내용을 기록하는 로거

  • Security 관련

    구분 설명

    jeus.security

    JEUS Security 관련 로거

    jeus.security.impl.login

    JEUS Security 로그인 서비스 관련 로거

    jeus.security.util

    JEUS Security 유틸리티 관련 로거

  • 기타 주요 로거

    구분 설명

    jeus.classloader

    JEUS 클래스 로딩 관련 로거

    jeus.clustering

    JEUS 서버 클러스터링 관련 로거

    jeus.config

    JEUS 동적 설정 변경 관련 로거

    jeus.connector

    Jakarta EE Connector 관련 로거

    jeus.converter

    XML 컨버터 관련 로거

    jeus.ddinit

    DD Initializer 관련 로거

    jeus.deploy

    애플리케이션 Deploy 관련 로거

    jeus.domain

    도메인 관련 로거

    jeus.filetransfer

    설정 파일, 애플리케이션 파일 전송 관련 로거

    jeus.io

    JEUS Network I/O Library 관련 로거

    jeus.jdbc

    JDBC Connection Pool 관련 로거

    jeus.jmx

    JMX 관련 로거

    jeus.jndi

    JNDI 관련 로거

    jeus.jnlp

    JNLP 관련 로거

    jeus.jtmax

    JTmax 관련 로거

    jeus.management

    JMX MBean Framework 관련 로거

    jeus.net

    JEUS Network API 관련 로거

    jeus.rmi

    JEUS RMI 관련 로거

    jeus.scheduler

    JEUS 스케줄러 관련 로거

    jeus.service

    JEUS 서비스 MBean 관련 로거

    jeus.weld

    JEUS CDI 관련 로거

    jeus.logger.status

    JEUS Asynchronous logger(서버 로거)의 예외를 기록하는 로거

2.7. 로그 메시지 모듈 이름

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

모듈 이름 모듈 정보

Connector

Connector

Console

콘솔 커맨드

Config

설정 파일 동기화와 관련 모듈

CORBA

CORBA

CPOOL

Connection

D_Session

분산식 세션 서버

Deploy

애플리케이션 Deploy

Domain

도메인

EJB

EJB 엔진

JDBC

JDBC

JMS

JMS 엔진

JMSC

JMS Clustering

JMSF

JMS Failover

JMX

JMX

JMXR

JMX Remote

JNDI.Common

JNDI 공통

JNDI.Context

JNDI Context

JNDI.Local

JNDI Local 클라이언트

JNDI.Remote

JNDI Remote 클라이언트

JNSS

JNDI 서버

JPA

JPA

JTMAX

JTmax

Launcher

JEUS Launcher (Launcher 프로세스)

Network

JEUS 네트워크

OTS

OTS

SCF

SCF(JEUS System Clustering Framwork)

Scheduler

스케줄러

Secutiry

JEUS Security

SERVER

서버 부트, 다운, 모니터링 관련 모듈

Session

세션 서버

TM

트랜잭션 매니저

TMRecovery

트랜잭션 매니저 Recovery

UDDI

UDDI

WEB

서블릿 엔진

WebT

WebT

WebtobLight

WebtoB

WSS

웹 서비스 Security

WSVC

웹 서비스

3. 로깅 설정

본 절에서는 JEUS에서 로깅에 대한 설정 방법과 Customization 방법 등을 설명한다.

3.1. 로거 정보 확인

jeus 로거는 설정이 없더라도 기본적으로 존재한다. 그러나 jeus 로거를 제외한 다른 로거들은 설정하지 않으면 상위 로거(jeus 로거)의 핸들러(handler)를 사용해서 로그 메시지를 출력한다. jeus 로거는 설정되지 않으면 파일 핸들러(File Handler)를 사용한다. 따라서 서버에 아무런 로거 설정을 하지 않았다면 서버가 운영되면서 발생하는 로그 메시지는 디폴트 로그 파일에 남게 된다. 이때 로그 레벨(level)은 INFO이다. jeus 로거는 상위 로거의 핸들러를 사용하지 않는다.

서버의 로그 메시지를 콘솔에서 확인하고 싶다면 서버를 부팅할 때 -verbose 옵션을 설정한다. 옵션을 설정하면 Launcher 프로세스가 서버를 부팅시킨 후 종료되지 않고 서버가 shutdown될 때까지 살아있으면서 서버의 로그 메시지를 파이프를 통해 읽어서 콘솔에 출력하는 기능을 한다.

본 절에서는 콘솔 툴을 사용해서 서버에 기본적으로 존재하는 jeus 로거에 대한 정보를 확인하는 예를 설명한다.

콘솔 툴 사용

콘솔 툴에서 다음과 같이 log-level, list-log-handlers 명령어를 수행하면 jeus 로거와 그에 등록된 핸들러에 대한 정보를 확인할 수 있다. 각 명령어의 사용 방법에 대한 자세한 내용은 JEUS Reference 안내서의 Server Management 관련 명령어를 참고한다.

[MASTER]domain1.adminServer>log-level -server server1 jeus
The logger[jeus] information for the server [server1]
Information about the logger[jeus].
================================================================================
Logger Name : jeus
Level : INFO
Use Parent Handlers : false

+---------------------------------------------+----------------+---------------+
|                 Handler Name                |  Handler Type  | Handler Level |
+---------------------------------------------+----------------+---------------+
| jeus.util.logging.ConsoleHandler@1698156408 | ConsoleHandler | ALL           |
| FileHandler                                 | FileHandler    | FINEST        |
+---------------------------------------------+----------------+---------------+
================================================================================

[MASTER]domain1.adminServer>modify-logger -server server1 jeus
Show the current configuration.
The logger[jeus] information for the server [server1]
================================================================================
+---------------------+--------------------------------------------------------+
|         Name        |                          Value                         |
+---------------------+--------------------------------------------------------+
| Level               | INFO                                                   |
| Use Parent Handlers | false                                                  |
| Formatter           | [%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] %m      |
+---------------------+--------------------------------------------------------+
================================================================================

[MASTER]domain1.adminServer>list-log-handlers -server server1 jeus
List of Loggers
================================================================================
+-------------------------------------+----------------------------------------+
| Handler Name                        | FileHandler                            |
| Handler Type                        | FileHandlerType                        |
| Handler Level                       | FINEST                                 |
| Filename                            | JeusServer.log                         |
| Enable Rotation                     | true                                   |
| Rotation Directory                  | ${SERVER_HOME}/logs                    |
| Valid Day                           | 1                                      |
| Buffer Size                         | 1024                                   |
| Append Logs                         | true                                   |
+-------------------------------------+----------------------------------------+
================================================================================

콘솔 툴을 통해 jeus 로거 정보를 확인했을 때 콘솔 핸들러가 보여지는 경우는 2가지이다.

  • 서버를 부팅할 때 실행 스크립트에 -verbose 옵션을 설정한 경우

  • 서버가 부팅 중인 경우

서버를 부팅할 때 -verbose 옵션을 설정한 경우는 Launcher 프로세스로 콘솔 로그가 출력된다. 또한 서버가 부팅 중인 경우에도 Launcher 프로세스를 통해서 로그 메시지가 콘솔 화면에 출력될 수 있다.

3.2. 동적으로 로거 설정

콘솔 툴을 통해서 런타임(runtime)에 동적으로 로거나 핸들러를 추가, 삭제, 변경할 수 있다.

콘솔 툴 사용

콘솔 툴에서 add-logger, modify-logger, remove-logger 명령어를 사용해서 로깅 설정을 동적으로 변경할 수 있다. 각 명령어에 대한 자세한 내용은 JEUS Reference 안내서의 Server Management 관련 명령어를 참고한다.

list-loggers 명령어를 사용하여 현재 설정되어 있는 로거 정보를 확인할 수 있다.

[MASTER]domain1.adminServer>list-loggers server1
List of Loggers
================================================================================
+-------------+-------+---------------+--------+-------------------------------+
| Logger Name | Level |   Use Parent  | Filter |           Formatter           |
|             |       |   Handlers    |        |                               |
+-------------+-------+---------------+--------+-------------------------------+
| jeus        | INFO  | false         |        | [%d{yyyy.MM.dd HH:mm:ss}][%l] |
|             |       |               |        | [%J-%T] [%M-%N] %m            |
+-------------+-------+---------------+--------+-------------------------------+
================================================================================

[MASTER]domain1.adminServer>add-logger -server server1 jeus.ejb -level FINEST
Successfully performed the ADD operation for The logger for the server(server1)..
Check the results using "list-loggers or add-logger".

[MASTER]domain1.adminServer>add-logger -server server1 jeus.ejb.clustering -level FINEST
Successfully performed the ADD operation for The logger for the server(server1)..
Check the results using "list-loggers or add-logger".

[MASTER]domain1.adminServer>list-loggers server1
List of Loggers
================================================================================
+--------------+--------+--------------+--------+------------------------------+
|  Logger Name |  Level |  Use Parent  | Filter |           Formatter          |
|              |        |   Handlers   |        |                              |
+--------------+--------+--------------+--------+------------------------------+
| jeus         | INFO   | false        |        | [%d{yyyy.MM.dd               |
|              |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
| jeus.ejb     | FINEST | true         |        | [%d{yyyy.MM.dd               |
|              |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
| jeus.ejb.clu | FINEST | true         |        | [%d{yyyy.MM.dd               |
|stering       |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
================================================================================

[MASTER]domain1.adminServer>modify-logger -server server1 jeus.ejb.clustering -level FINE
Successfully performed the MODIFY operation for The logger[jeus.ejb.clustering] information for the server [server1].
Check the results using "modify-logger".

[MASTER]domain1.adminServer>list-loggers server1
List of Loggers
================================================================================
+--------------+--------+--------------+--------+------------------------------+
|  Logger Name |  Level |  Use Parent  | Filter |           Formatter          |
|              |        |   Handlers   |        |                              |
+--------------+--------+--------------+--------+------------------------------+
| jeus         | INFO   | false        |        | [%d{yyyy.MM.dd               |
|              |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
| jeus.ejb     | FINEST | true         |        | [%d{yyyy.MM.dd               |
|              |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
| jeus.ejb.clu | FINE   | true         |        | [%d{yyyy.MM.dd               |
|stering       |        |              |        |HH:mm:ss}][%l] [%J-%T]        |
|              |        |              |        |[%M-%N] %m                    |
+--------------+--------+--------------+--------+------------------------------+
================================================================================

[MASTER]domain1.adminServer>remove-logger -server server1 jeus.ejb
Successfully performed the REMOVE operation for The logger for the server(server1)..
Check the results using "list-loggers or remove-logger".

[MASTER]domain1.adminServer>list-loggers server1
List of Loggers
================================================================================
+--------------+-------+--------------+--------+-------------------------------+
|  Logger Name | Level |  Use Parent  | Filter |           Formatter           |
|              |       |   Handlers   |        |                               |
+--------------+-------+--------------+--------+-------------------------------+
| jeus         | INFO  | false        |        | [%d{yyyy.MM.dd HH:mm:ss}][%l] |
|              |       |              |        | [%J-%T] [%M-%N] %m            |
+--------------+-------+--------------+--------+-------------------------------+
| jeus.ejb.clu | FINE  | true         |        | [%d{yyyy.MM.dd HH:mm:ss}][%l] |
|stering       |       |              |        | [%J-%T] [%M-%N] %m            |
+--------------+-------+--------------+--------+-------------------------------+
================================================================================

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

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

본 절에서는 콘솔 툴을 통해 표준 출력과 표준 에러를 JEUS 로그 형식으로 출력하도록 설정하는 방법에 대해 설명한다.

콘솔 툴 사용

콘솔 툴에서 표준 출력과 표준 에러를 JEUS 로그 형식으로 출력하는 설정에 대한 예제이다.

[MASTER]domain1.adminServer>modify-server server1
Shows the current configuration.
server (server1)
================================================================================
+--------------------------------+---------------------------------------------+
| JVM Configs                    | -Xmx1024m -XX:MaxMetaspaceSize=512m         |
| Action On Resource Leak        | WARNING                                     |
| Stdout to Raw Format           | true                                        |
| MEJB                           | false                                       |
| Class FTP                      | false                                       |
| Server Log Home Directory      | none                                        |
+--------------------------------+---------------------------------------------+
================================================================================

[MASTER]domain1.adminServer>modify-server server1 -logStdoutToRawFormat false
Successfully performed the MODIFY operation for server (server1).
Check the results using "list-servers server1 or modify-server server1".

[MASTER]domain1.adminServer>list-servers server1
List of Editable Servers
================================================================================
+-----+--------+-----+---------+---------+---------+-----+-----+---------+-----+
| Ser |  Base  | Node|   JVM   |  Action |  Stdout | MEJB| Cla |  Server | Type|
| ver | Listen |     | Configs |   On    | to Raw  |     | ss  |Log Home |     |
|     |Address |     |         |Resource | Format  |     | FTP | Directo |     |
|     | /Port  |     |         |   Leak  |         |     |     |   ry    |     |
+-----+--------+-----+---------+---------+---------+-----+-----+---------+-----+
| ser |0.0.0.0 |     | -Xmx102 | Warning | false   | fal | fal | none    | ser |
|ver1 |/ 9836  |     |4m       |         |         |se   |se   |         |ver  |
|     |        |     |-XX:MaxM |         |         |     |     |         |     |
|     |        |     |etaspace |         |         |     |     |         |     |
|     |        |     |Size=512m|         |         |     |     |         |     |
+-----+--------+-----+---------+---------+---------+-----+-----+---------+-----+
================================================================================

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

[%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] [STDOUT/STDERR] %m
항목 설명

%d{yyyy.MM.dd HH:mm:ss}

로그 이벤트의 날짜를 출력한다. 뒤에 '{}' 에 추가하는 DATE_FORMAT에는 출력하고자하는 날짜의 형식을 입력한다. DATE_FORMAT의 Formatting 방식은 JDK의 SimpleDateFormat 방식을 따른다.

%l

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

  • 0 : SEVERE

  • 1 : WARNING

  • 2 : INFO

  • 3 : CONFIG

  • 4 : FINE

  • 5 : FINER

  • 6 : FINEST

  • 7 : ALL

%J

로그 메시지를 로깅하는 프로세스가 출력된다. Thread 정보를 나타낸다.

%T

로그 메시지를 로깅하는 Thread번호가 출력된다. Thread 정보가 같은 로그 메시지는 같은 Thread에서 로깅한 것이다.

%M

로그를 출력하는 모듈의 이름이 출력된다. 각 모듈에 해당하는 이름은 로그 메시지 모듈 이름을 참고한다.

%N

출력되는 로그 이벤트의 메시지 번호를 출력한다.

%m

System.out이나 System.err를 통해 출력할 메시지이다. 만약 표준 출력이나 표준 에러에 대한 로그이면 메시지 앞에 [STDOUT] 혹은 [STDERR] 와 같은 메시지가 추가되어 출력된다.

  • STDOUT : 로깅하려는 메시지가 표준 출력인 경우이다.

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

  • UNKNOWN : 알 수 없는 경우이다.

%c

로그 메시지를 로깅하는 로거의 이름을 출력한다.

3.4. 로거 설정

콘솔 툴을 사용하여 로거나 핸들러를 추가, 삭제, 수정할 수 있고 이는 모두 동적 반영 가능하다. 즉, 운영 중인 서버를 재기동하지 않아도 변경한 설정 내용이 적용될 수 있다.

로거에서 동적 반영 가능한 설정은 레벨(level)과 상위 핸들러를 사용할지 여부(use-parent-handlers)이다. 핸들러에서는 레벨(level) 만 동적반영 가능하다. 또한 콘솔 툴 명령어로는 파일 핸들러만 추가, 변경이 가능하다.

Logger 추가

다음과 같이 콘솔 툴을 사용하여 로거를 추가하거나 사용 중인 로거를 조회할 수 있다.

[MASTER]domain1.adminServer>add-logger logger2 -level SEVERE -useParentHandlers false -server server1
Successfully performed the ADD operation for The logger for the server(server1)., but all changes were non-dynamic. They will be applied after restarting.
Check the results using "list-loggers or add-logger".
[MASTER]domain1.adminServer>list-loggers server1
List of Loggers
================================================================================
+-------------+--------+---------------+--------+------------------------------+
| Logger Name |  Level |   Use Parent  | Filter |           Formatter          |
|             |        |   Handlers    |        |                              |
+-------------+--------+---------------+--------+------------------------------+
| jeus        | INFO   | false         |        | [%d{yyyy.MM.dd               |
|             |        |               |        |HH:mm:ss}][%l] [%J-%T]        |
|             |        |               |        |[%M-%N] %m                    |
+-------------+--------+---------------+--------+------------------------------+
| logger2     | SEVERE | false         |        | [%d{yyyy.MM.dd               |
|             |        |               |        |HH:mm:ss}][%l] [%J-%T]        |
|             |        |               |        |[%M-%N] %m                    |
+-------------+--------+---------------+--------+------------------------------+
================================================================================

다음은 설정 항목에 대한 설명이다.

항목 설명

server-name

로거를 추가할 서버의 이름이다.

logger-name

로거의 이름을 설정한다.

log-level

로거의 레벨(level)을 설정한다. 이 레벨 이하의 메시지만 로거를 통해 출력된다. Logging API의 레벨인 다음의 값이 설정된다.

  • SEVERE

  • WARNING

  • INFO (기본값)

  • CONFIG

  • FINE

  • FINER

  • FINEST

  • ALL

use-parent-handlers

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

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

filter-class

로거가 로그 메시지를 핸들러에게 보내기 전에 수행하는 필터링(filtering)에 사용할 클래스를 지정한다. 여기에 지정된 클래스는 lib/application 디렉터리의 JAR 파일 내에 포함되어 있어야 한다.

formatter-pattern

로거가 로그 메시지를 핸들러에 보내기 전에 로그 메시지를 포맷팅하는데 이때 사용하는 포맷 패턴을 지정한다.

(기본값: [%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] %m)

JEUS 4.x에서 사용하던 로그 레벨인 FATAL, NOTICE, INFORMATION, DEBUG 레벨은 JEUS 7부터는 사용할 수 없다.

Handler 추가

Handler에는 파일 핸들러, SMTP 핸들러, 소켓 핸들러, 사용자 핸들러가 있으며 각 핸들러에 대해 다음과 같은 설정들이 있다.

  • 파일 핸들러

    파일 핸들러는 파일로 로그 메시지를 출력하는 핸들러이다. 다음과 같이 jeusadmin 명령어를 통해 추가할 수 있다.

    [MASTER]domain1.adminServer>add-handler handler2 -server server1 -logger logger2 -level FINEST -filename logFile2.log -enable false -day 1
    Successfully performed the ADD operation for The handler for the logger(logger2) on the server(server1)., but all changes were non-dynamic. They will be applied after restarting.
    Check the results using "list-log-handlers or add-log-handler".
    항목 설명

    Name

    핸들러를 나타내는 이름을 지정한다. 이름은 하나의 로거 내에서 유일해야 한다. 만약 지정하지 않으면 클래스 이름과 Hash Code를 조합한 이름이 사용된다.

    File Name

    핸들러가 로그 메시지를 출력할 파일의 이름을 지정한다. 절대 경로로 되어 있다면 그 경로로 파일이 생성되고 상대 경로라면 각 로거의 기본 경로를 기준으로 한 상대 경로로 인식한다.

    설정하지 않으면 각 로거별로 지정된 경로로 파일을 생성해서 로그 메시지를 출력한다.

    Level

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

    기본값으로 설정하면 로거를 통과하는 모든 로그 메시지가 핸들러에 의해 출력된다. (기본값: FINEST)

    Log chown

    Log 파일의 소유자, 소유그룹 설정을 한다. ,(comma)로 구분하는 소유자와 소유그룹을 순서대로 입력한다.

    Log Permission

    Log 파일의 접근 권한 설정을 한다. 9자리의 r,w,x,-로 이루어진 log permission을 주도록 한다. Unix 계열 OS를 사용하는 경우에만 유효하다.

    Enable Rotation

    핸들러가 로그 파일 로테이션 기능을 사용할 것인지 설정한다. 기본값으로 설정하면 로테이션 기능을 사용한다. (기본값: true)

    Rotation Count

    로테이션의 횟수를 설정한다. 핸들러가 로그 파일 로테이션 기능을 사용할 때만 의미가 있다. (기본값: 10)

    Valid Day

    핸들러가 출력할 파일을 날짜별로 생성할 경우에 사용한다.

    파일 이름의 형식은 파일 끝에 "_YYYYMMDD"가 붙는다.

    Valid Hour

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

    24의 약수(예: 3, 6)이거나 24로 나눈 나머지가 약수(예: 27, 30)인 값을 지정한다. 파일 이름의 형식은 끝에 "_YYYYMMDD_HH"가 붙는다.

    Valid Size

    핸들러가 출력할 파일을 크기별로 생성할 경우에 설정하는 항목으로 핸들러가 로그 파일 로테이션 기능을 사용할 때만 의미가 있다.

    Encoding

    핸들러가 출력하는 문자열의 인코딩을 지정한다. 기본은 시스템 인코딩으로 설정되어 있다.

    Filter Class

    핸들러가 로그 메시지를 필터링해서 출력하고자 할 때 이용되는 클래스이다. 로거의 Filter Class와 마찬가지로 lib/application에 해당 클래스를 포함한 JAR 파일이 존재해야 한다.

    Append

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

    • true : 파일 끝에 계속 추가한다. (기본값)

    • false : 로테이션을 사용 여부에 따라서 의미가 달라진다. 로테이션을 사용하고 있다면 서버를 기동할 때마다 이전 로그 파일은 백업되고 새로운 로그 파일이 생성된다. 그러나 로테이션을 사용하고 있지 않다면 서버를 기동할 때마다 이전 로그 파일이 삭제되므로 주의해서 사용해야 한다.

    Rotation Dir

    핸들러가 로그 파일 로테이션 기능을 사용할 때만 의미가 있다.

    시스템 환경 변수나 시스템 프로퍼티의 값을 사용해 경로를 지정할 수 있다. 예를 들어 <rotation-dir>${JEUS_HOME}/rotatedLog/${jeus.server.name}</rotation-dir>와 같이 경로를 설정할 수 있다.

    Buffer Size

    파일로 출력할 때 사용할 버퍼(buffer)의 크기를 지정한다. 버퍼가 클수록 로깅의 성능은 좋아지지만 예상치 못한 상황으로 인해 JEUS가 비정상 종료될 때에는 그 버퍼 크기만큼 로그가 손실될 수도 있다. (기본값: 1024, 단위: KB)

    버퍼에 로그 메시지를 축적했다가 버퍼의 크기가 설정한 크기보다 커지면 로그 메시지를 파일에 출력한다.

  • SMTP 핸들러

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

    파일 핸들러 이외의 핸들러를 추가하기 위해서는 jeus.logging.useAsync 옵션을 false로 설정해야 하며, 다음과 같이 domain.xml을 편집하여 추가할 수 있다.

    <smtp-handler>
        <name>smtphandler</name>
        <level>WARNING</level>
        <smtp-host-address>gw.tmaxsoft.com</smtp-host-address>
        <sender-id>sender@tmaxsoft.com</sender-id>
        <sender-password>1234567</sender-password>
        <from-address>sender@tmaxsoft.com</from-address>
        <to-address>receiver@tmaxsoft.com</to-address>
        <property>
            <key>mail.smtp.socketFactory.port</key>
            <value>465</value>
        </property>
        <property>
            <key>mail.smtp.socketFactory.class</key>
            <value>javax.net.ssl.SSLSocketFactory</value>
        </property>
        <property>
            <key>mail.smtp.auth</key>
            <value>true</value>
        </property>
        <send-for-all-messages>true</send-for-all-messages>
    </smtp-handler>
    항목 설명

    Name

    핸들러가 툴에서 보여질 때 사용할 이름을 지정한다. 이름은 하나의 로거 내에서 유일해야 한다. 만약 지정하지 않으면 클래스 이름과 Hash Code 이름이 대체된다.

    Level

    핸들러가 출력할 메시지의 레벨을 지정한다. 즉, 로거를 통과한 로그 메시지가 해당 로거가 사용하는 각각의 핸들러에게 전달되는데, 이 핸들러의 레벨에 부합하는 로그 메시지만 해당 핸들러에 의해 출력된다. 기본값으로 설정하면 로거를 통과하는 모든 로그 메시지가 핸들러에 의해 출력된다. (기본값: FINEST)

    Smtp Host Address

    이메일을 보낼 호스트(host)의 주소를 지정한다.

    From Address

    이메일을 보내는 사람의 주소를 지정한다.

    Sender ID

    이메일을 보내는 사람의 ID를 명시한다.

    Sender Password

    이메일을 보내는 사람의 패스워드를 지정한다. 암호화해서 저장할 때에는 "{암호화할 알고리듬}암호화된 패스워드"와 같은 형식으로 입력한다.

    To Address

    이메일을 받는 사람의 주소를 지정한다.

    Property

    사용하는 메일 서버마다 요구하는 특정한 SMTP 프로퍼티가 있을 수 있다.

    Send For All Messages

    모든 메시지를 SMTP 핸들러로 보낼지를 결정한다. false이면 JEUS 시스템에서 이메일로 전송하기로 결정되어 있는 메시지만 이 핸들러를 사용해서 보내진다. 현재 이 설정은 사용자 로거에만 유효하다. (기본값: false)

    Encoding

    핸들러가 출력하는 문자열의 인코딩을 지정한다. 기본은 시스템 인코딩으로 설정되어 있다.

    Filter Class

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

    Cc Address

    이메일을 참조로 받는 사람의 주소를 지정한다.

    Bcc Address

    이메일을 숨은 참조로 받는 사람의 주소를 지정한다.

  • 소켓 핸들러

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

    항목 설명

    Name

    핸들러가 툴에서 보여질 때 사용할 이름을 지정한다. 이름은 하나의 로거 내에서 유일해야 한다. 지정하지 않으면 클래스 이름과 Hash Code 이름이 대체된다.

    Level

    핸들러가 출력할 메시지의 레벨을 지정한다. 즉, 로거를 통과한 로그 메시지가 해당 로거가 사용하는 각각의 핸들러에게 전달되는데, 이 핸들러의 레벨에 부합하는 로그 메시지만 해당 핸들러에 의해 출력된다. 기본값으로 설정하면 로거를 통과하는 모든 로그 메시지가 핸들러에 의해 출력된다. (기본값: FINEST)

    Address

    핸들러가 접속할 머신(machine)의 IP 주소를 지정한다.

    Port

    핸들러 접속할 머신의 포트 번호를 지정한다.

    Encoding

    핸들러가 출력하는 문자열의 인코딩을 지정한다. 기본은 시스템 인코딩으로 설정되어 있다.

    Filter Class

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

  • 사용자 핸들러

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

    항목 설명

    Name

    핸들러가 툴에서 보여질 때 사용할 이름을 지정한다. 이름은 하나의 로거 내에서 유일해야 한다. 지정하지 않으면 클래스 이름과 Hash Code 이름이 대체된다.

    Level

    핸들러가 출력할 메시지의 레벨을 지정한다. 즉, 로거를 통과한 로그 메시지가 해당 로거가 사용하는 각각의 핸들러에게 전달되는데, 이 핸들러의 레벨에 부합하는 로그 메시지만 해당 핸들러에 의해 출력된다. 기본값으로 설정하면 로거를 통과하는 모든 로그 메시지가 핸들러에 의해 출력되도록 되어 있다. (기본값: FINEST)

    Handler Class

    사용자가 생성한 핸들러의 클래스를 지정한다. 해당 클래스는 lib/application 디렉터리의 JAR 파일에 포함되어 있어야 한다. 또한 해당 클래스는 Logging API의 java.util.logging.Handler를 상속받고 jeus.util.logging.JeusHandler를 구현해야 한다.

    Handler Property

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

    Formatter Pattern

    출력되는 로그의 형식을 지정한다. (기본값: [%d{yyyy.MM.dd HH:mm:ss}] [%l] [%J-%T] [%M-%N] %m)

    Formatter Property

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

    Encoding

    핸들러가 출력하는 문자열의 인코딩을 지정한다. 기본은 시스템 인코딩으로 설정되어 있다.

    Filter Class

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

3.5. 로그 파일 로테이션 설정

JEUS가 시작될 때 또는 JEUS 운영 중에 설정한 시간이 되거나 파일 사이즈를 넘으면 자동으로 이전에 로깅하던 파일의 이름은 변경하고 새로 출력할 로그들은 원래의 로그 파일에 계속 로깅할 수 있도록 로그 파일 로테이션(Log File Rotation) 기능을 제공한다.

콘솔 툴 사용

콘솔 툴에서 File Handler의 로그 파일 로테이션 설정은 modify-log-handler 명령어를 통해 설정할 수 있다. 콘솔 툴에서 로테이션 설정을 위해 사용할 수 있는 옵션으로는 -hour, -size, -day의 3개 항목이 있으며, 기본적으로 day 1로 설정되어 있다.

로테이션의 조건이 되는 3개의 항목 중 아무것도 설정되어 있지 않으면 매일 00시 00분이 되면 로깅하던 파일의 이름을 변경해서 백업하고 이후에 로깅되는 파일은 이전에 로깅하던 파일에 새로 로깅한다.

다음은 jeusadmin을 사용하여 로그 로테이션을 변경하는 예시이다.

[MASTER]domain1.adminServer>modify-log-handler fileHandler -server adminServer -logger jeus -day 2
Successfully performed the MODIFY operation for The handler(fileHandler) for the logger(jeus) in server (adminServer), but all changes were non-dynamic. They will be applied after restarting.
Check the results using "modify-log-handler".

3.6. 프로퍼티 설정

필요한 프로퍼티 설정은 다음과 같다.

  • 시스템 프로퍼티 설정

    Standalone 클라이언트에서 로거 설정을 할 경우 로그 레벨을 시스템 프로퍼티로 설정할 수 있다.

  • 로깅 프로퍼티 파일

    Java 로깅 프로퍼티(logging.properties) 파일에 로깅 설정을 할 수 있다.

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

    -Djava.util.logging.config.file = <프로퍼티 파일 경로>

JEUS 6까지 사용 가능했던 jeuslogging.properties 파일은 JEUS 7부터는 사용할 수 없다.

레벨 설정 우선순위

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

  1. 시스템 프로퍼티

  2. Java 로깅 프로퍼티(logging.properties) 파일

  3. domani.xml의 로깅 설정

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