15장. 로깅 서브시스템

Name

Date

Reason For Changes

Version

오픈나루

2013/11

Initial Version

1.0

전준식, jjeon@opennaru.com

2018/02

Second Version

2.0

이번 장에서는 시스템 상황이나 에러에 대한 정보를 출력하는 로깅 서브시스템에 대해서 설명한다. JBoss가 부팅될 때 기록하는 부트 로거와 부팅된 이후에 사용하는 로깅 서브시스템에 대해 설명한다. 로그 파일이 남는 경로 및 기본적인 로깅 설정 방법에 대해서 살펴보자.

15-1.JBoss Logging 이해

로깅은 애플리케이션의 활동을 일련의 메시지로 기록하는 것이다.

로그 메시지는 애플리케이션을 개발하면서 디버깅하는 개발자나 운영 환경에서 시스템을 관리하는 관리자에게 매우 중요한 정보를 제공한다.

최근의 Java 로깅 프레임워크들은 대부분 정확한 시간과 메시지의 출처 등 다른 정보도 함께 제공하고 있다.

JBoss EAP 6는 EAP 자체의 정보를 출력하거나 배포된 애플리케이션에서 사용하기 위해 다양한 설정이 가능한 로깅 시스템을 제공한다. JBoss EAP 6의 로깅 시스템은 JBoss LogManager를 기반으로 하고 log4j, Java Utils 로깅(java.util.logging) 및 JBoss Logging을 포함한 다양한 로깅 프레임워크를 지원한다.

또, JBoss EAP 6에 배포되는 애플리케이션에서 로깅 기능을 사용할 수 있도록 강력하고 편리한 로깅 프레임워크인 JBoss Logging을 제공한다.

JBoss LogManager 는 다음과 같은 로깅 프레임워크를 지원한다.

부트 로거 설정

부트 로그는 JBoss EAP 6 서버 부팅 중 발생한 이벤트를 기록한다. JBoss에서 제공하는 로깅 서브시스템도 extension으로 제공되는 모듈이기 때문에 로깅 서브시스템이 활성화되기 전까지 발생하는 이벤트를 기록할 로거가 필요하다. 부트 로거가 그 역할을 한다.

로그 출력 레벨 및 로그 로테이션 등이 이미 설정되어 있어 기본값에서 변경하지 않아도 된다.

구분 기본값 비고

로그파일 저장 위치

$jboss.server.base.dir/log

로그파일 이름

boot.log

콘솔 및 파일에 출력

부트 로그는 logging.properties 파일을 편집하여 설정할 수 있다. 이 파일은 Java의 표준 프로퍼티 파일이며 텍스트 편집기로 편집하면 된다.

구분 로깅 프로퍼티 파일 경로

도메인 모드

$JBOSS_HOME/domain/configuration/logging.properties

스탠드얼론 모드

$JBOSS_HOME/standalone/configuration/logging.properties

다음은 JBoss의 설정 파일 정보를 DEBUG 레벨로 출력하도록 logging.properties 설정 파일을 변경한 예제이다.

# Additional loggers to configure (the root logger is always configured)

loggers=org.jboss.as.config

# Root logger level

logger.level=$\{jboss.boot.server.log.level:INFO}

# Root logger handlers

logger.handlers=BOOT_FILE,CONSOLE

logger.org.jboss.as.config.level=DEBUG

logger.org.jboss.as.config.useParentHandlers=true

# Console handler configuration

handler.CONSOLE=org.jboss.logmanager.handlers.ConsoleHandler

handler.CONSOLE.properties=autoFlush

handler.CONSOLE.level=$\{jboss.boot.server.log.console.level:INFO}

handler.CONSOLE.autoFlush=true

handler.CONSOLE.formatter=PATTERN

# File handler configuration

handler.BOOT_FILE=org.jboss.logmanager.handlers.PeriodicRotatingFileHandler

handler.BOOT_FILE.level=DEBUG

handler.BOOT_FILE.properties=autoFlush,fileName

handler.BOOT_FILE.autoFlush=true

handler.BOOT_FILE.fileName=$\{org.jboss.boot.log.file:boot.log}

handler.BOOT_FILE.formatter=PATTERN

# Formatter pattern configuration

formatter.PATTERN=org.jboss.logmanager.formatters.PatternFormatter

formatter.PATTERN.properties=pattern

formatter.PATTERN.pattern=%d\{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n

기본 로그 파일 위치

로그 파일이 만들어지는 위치는 다음과 같다. 기본적으로 1일 주기로 로그 파일이 변경되도록 설정되어 있다.

로그 파일 설명

$JBOSS_HOME/standalone/log/boot.log

서버 부팅 로그 파일

$JBOSS_HOME/standalone/log/server.log

서버가 시작된 이후 모든 로그 메시지가 기록되는 파일

표 1. 스탠드얼론 모드의 로그 파일 위치

서버 로그 설정

서버 로그에는 서버가 부팅된 이후 JBoss EAP 6의 서비스와 서버 자체에 대한 로그가 출력된다.

아래는 standalone.xml의 로깅 서브시스템 설정 부분이다. 콘솔 핸들러와 server.log 파일이 주기적으로 로테이팅하는 파일 핸들러(periodic-rotating-file-handler)를 사용하도록 설정되어 있다. 몇 가지 logger 카테고리와 root-logger가 설정되어 있다.

여기서 주기적으로 로그를 로테이팅하는 설정은 <suffix value=".yyyy-MM-dd"/>의 파일 이름으로 지정되어 있다. 파일의 이름이 .2013-11-28과 같은 형식으로 생성되며, 이 값은 일 단위로 로그를 로테이팅 하도록 설정한 것이다.

<subsystem xmlns="urn:jboss:domain:logging:1.2">
  <console-handler name="CONSOLE">
    <level name="INFO"/>
    <formatter>
      <pattern-formatter pattern="%K\{level}%d\{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
    </formatter>
  </console-handler>
  <periodic-rotating-file-handler name="FILE" autoflush="true">
    <formatter>
      <pattern-formatter pattern="%d\{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
  </periodic-rotating-file-handler>

  <logger category="com.arjuna">
    <level name="WARN"/>
  </logger>
  <logger category="org.apache.tomcat.util.modeler">
    <level name="WARN"/>
  </logger>
  <logger category="org.jboss.as.config">
    <level name="DEBUG"/>
  </logger>
  <logger category="sun.rmi">
    <level name="WARN"/>
  </logger>
  <logger category="jacorb">
    <level name="WARN"/>
  </logger>
  <logger category="jacorb.config">
    <level name="ERROR"/>
  </logger>
  <root-logger>
    <level name="INFO"/>
    <handlers>
      <handler name="CONSOLE"/>
      <handler name="FILE"/>
    </handlers>
  </root-logger>
</subsystem>

로그 파일 저장 디렉터리 변경

기본적으로 server.log의 로그 디렉터리는 시스템 프로퍼티 ’jboss.server.log.dir’에 의해 결정된다.

<file relative-to="*jboss.server.log.dir*" path="server.log"/>

서버 구성시 로그 파일의 저장 디렉터리를 변경하려면, ‘-Djboss.server.log.dir’에 로그를 남길 디렉터리를 지정하면 된다.

standalone.sh에 아래와 같이 로그 디렉터리를 변경하는 옵션을 추가한다.

export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=/logs/jboss-eap/server1"

로그 레벨

로그 레벨은 로그 메시지의 특성이나 심각도를 나타내는 것이다. 특정 로그 메시지의 레벨은 그 메시지를 전송하기 위해 선택한 로깅 프레임워크의 API를 사용하여 개발자가 코딩할 때 지정한다.

JBoss EAP 6는 6개의 로그 레벨을 사용한다. 낮은 것부터 높은 것 순서로 TRACE, DEBUG, INFO, WARN, ERROR, FATAL의 6단계이다.

로그 카테고리와 로그 핸들러는 수신된 메시지 중에서 지정된 레벨 이상의 메시지만 처리한다. 예를 들어, WARN 레벨의 로그 핸들러는 WARN, ERROR및 FATAL 메시지만 출력한다.

JBoss EAP 6는 JDK 로그 출력 레벨과 log4j 형식의 레벨을 모두 지원한다. JBoss EAP 6에서 사용할 수 있는 로그 레벨은 다음과 같다.

로그 레벨 개요 설명

FATAL

치명적인 에러

서비스 장애나 애플리케이션의 종료를 초래하거나 JBoss EAP 6 종료를 일으킬 수 있는 이벤트를 표시하는 데 사용한다.

ERROR

에러

서비스를 계속 할 수 있지만, 오류가 발생하는 경우에 사용하는 이벤트

WARN

조치할 수 있는 문제에 대한 경고

오류는 아니지만 앞으로 오류를 유발할 수 있는 경고 이벤트에 사용한다.

INFO

라이프사이클을 나타내는 정보

전반적인 진행 상황을 알리는 메시지에 사용한다. 애플리케이션 시작, 종료 등의 주요 수명주기 이벤트에 사용한다.

DEBUG

애플리케이션 디버그시 사용하는 정보

DEBUG 로그 메시지는 일반적으로 애플리케이션을 디버깅할 때만 사용한다.

TRACE

애플리케이션 디버그시 사용하는 상세 디버그 정보

애플리케이션의 실행 상태에 대한 자세한 정보를 제공하는 메시지에 사용한다. 일반적으로 애플리케이션을 디버깅할 때만 사용한다.

표 2. JBoss EAP 6의 로그 레벨

로거

자바 개발자는 애플리케이션의 상태를 알려주는 로그를 남기기 위해 소스 코드에 로거를 사용하여 코딩한다. 로거는 로그의 레벨과 자바 클래스나 패키지명을 사용한 카테고리를 사용할 수 있다. 로그의 카테고리는 자바 패키지명과 클래스 이름으로 만들어져 트리 구조를 가지게 된다.

트리 형태로 구성되어 있기 때문에 상위 패키지명에 로그 레벨을 지정하면 그 하위에 있는 패키지나 클래스에 함께 적용된다.

다음은 JBoss EAP에 기본적으로 설정된 로거 설정이다.

구분 설명 기본값

com.arjuna

Arjuna 트랜잭션

WARN

org.apache.tomcat.util.modeler

Tomcat의 JMX MBean에 대한 패키지

WARN

org.jboss.as.config

org.jboss.as.config 로 시작하는 패키지

DEBUG

sun.rmi

sun.rmi로 시작되는 패키지

WARN

jacorb

JacORB(CORBA API)

WARN

jacorb.config

jacorb.config로 시작되는 패키지

ERROR

표 3. 로거 카테고리 기본값

  • 로거의 로그 레벨 변경 방법

    JBoss EAP 6에서 트랜잭션을 담당하는 ‘com.arjuna’ 패키지에 대한 로그 레벨이 ‘WARN’ 레벨 이상의 로그를 출력하도록 설정되어 있다. 이 로그 레벨을 ‘DEBUG’ 레벨로 변경하는 방법을 살펴보자.

    [standalone@localhost:9999 /] cd /subsystem=logging/logger=com.arjuna
    
    [standalone@localhost:9999 logger=com.arjuna] :change-log-level(level=DEBUG)
    
    {"outcome" => "success"}
    
    [standalone@localhost:9999 logger=com.arjuna] :read-resource
    
    {
      "outcome" => "success",
      "result" => {
        "category" => "com.arjuna",
        "filter" => undefined,
        "filter-spec" => undefined,
        "handlers" => undefined,
        "level" => "DEBUG",
        "use-parent-handlers" => true
      }
    
    }

    새로운 로거를 추가하려면 다음과 같은 CLI 명령을 사용하면 된다.

    [standalone@localhost:9999 /] /subsystem=logging/logger=StatusManager:add(category=com.arjuna.ats.arjuna.StateManager, level=DEBUG)
    
    {"outcome" => "success"}

루트 로거

로거 트리 구조상에서 최상단 로거를 루트 로거(root logger)라고 한다. 트리의 최상단 노드는 로거의 카테고리 이름을 붙일 수 없어서 특별히 루트 로거라는 이름을 붙인 것이다. 루트 로거는 특별히 어떤 하위 로거에서 수신되지 않는 모든 로그 메시지를 수신한다. 로거 계층 구조의 최상단에 있기 때문에 루트 로거에 대한 설정은 그 하위의 다른 모든 로거에 영향을 미치고, 하위의 설정된 로거들은 루트 로거의 설정을 오버라이드한다.

루트 로거를 설정하는 CLI 명령들은 다음과 같은 것이 있다.

  • change-root-log-level : 루트 로거의 로그 레벨을 변경한다.

  • set-root-logger : 새로운 루트 로거를 설정한다.

  • remove-root-logger : 루트 로거를 삭제한다.

  • root-logger-assign-handler : 루트 로거의 핸들러를 정의한다.

  • root-logger-unassign-handler : 루트 로거의 핸들러를 삭제한다.

root-logger의 로그 출력 레벨의 변경

root-logger의 로그 레벨을 INFO에서 DEBUG로 변경하는 방법은 다음과 같다.

[standalone@localhost:9999 /] cd /subsystem=logging/periodic-rotating-file-handler=FILE

[standalone@localhost:9999 periodic-rotating-file-handler=FILE] :change-log-level(level=DEBUG)

{"outcome" => "success"}

[standalone@localhost:9999 periodic-rotating-file-handler=FILE] :read-resource

{
  "outcome" => "success",
  "result" => {
    "append" => true,
    "autoflush" => true,
    "enabled" => true,
    "encoding" => undefined,
    "file" => {
      "relative-to" => "jboss.server.log.dir",
      "path" => "server.log"
    },
    "filter" => undefined,
    "filter-spec" => undefined,
    "formatter" => "%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n",
    "level" => "DEBUG",
    "name" => "FILE",
    "suffix" => ".yyyy-MM-dd"
  }
}

로그 핸들러

로그 핸들러는 JBoss EAP에서 수신한 로그 메시지를 기록하는 방법을 정의한다. JBoss EAP 6에서 사용할 수 있는 핸들러는 다음 표와 같이 6가지 종류가 있다.

핸들러 설명 주요 파라미터

Console

(console-handler)

콘솔 로그 핸들러는 로그 메시지를 운영체제의 표준 출력(stdout) 또는 표준 오류(stderr)에 출력한다.

  • name:핸들러명을 지정

  • encoding:인코딩을 지정

  • level:로그 레벨 지정

  • filter:필터 지정

  • formatter:로그 출력 포맷을 지정

File

(file-handler)

파일 로그 핸들러는 로그 메시지를 지정된 파일에 저장하는 로그 처리기이다.

  • append:기존의 로그 파일에 추가할지 설정(기본값 true)

  • file:대상 로그 파일과 경로를 지정

Periodic

(periodic-rotaing-file-handler)

주기적 로그 핸들러는 지정된 시간마다 파일을 새로 만들어 저장하는 로그 처리기이다. 지정된 시간이 되면 기존 파일을 타임스탬프가 추가된 파일로 보관해 놓고 새로 생성된 로그 파일에 저장한다.

  • suffix : 로테이션 하는 로그 파일의 확장자를 지정한다. 확장자의 시간 포맷이 로테이션 간격이 된다.

Size

(size-rotating-flle-handler

사이즈 로그 핸들러는 파일이 지정된 크기가 될 때마다 새로운 파일을 만들어 저장하는 로그 처리기이다. 파일이 지정된 크기가 되면 파일명에 숫자를 붙여 보관하며, 보관하는 파일의 개수를 지정할 수 있다.

  • rotate-size:로테이션하는 파일 사이즈를 지정

  • max-backup-index:로테이션으로 만들어지는 로그 파일의 최대 백업 수

Async

(async-handler)

비동기 로그 핸들러는 여러 개의 로그 핸들러를 비동기 방식으로 처리할 수 있게 하여 주는 로그 처리기이다. 로그 저장을 비동기 방식으로 처리하기 때문에 성능이 향상될 수 있다.

  • queue-length:로그 이벤트를 담아둘 큐의 크기를 지정

  • overflow-action:큐가 오버플로우 됐을 때 동작을 지정한다. ‘block’과 ‘discard’를 설정할 수 있음

  • subhandlers:Async로 사용할 하위 핸들러를 지정

Custom

(custom-handler)

커스텀 로그 핸들러는 새로운 로그 핸들러를 설정할 수 있다. 커스텀 핸들러를 구현하려면 java.util.logging.Handler을 확장하여 모듈로 등록하여 사용한다.

기본 로그 핸들러

스탠드얼론 모드나 도메인 모드에는 콘솔 핸들러(console-handler)와 주기적 로테이팅 파일 핸들러(periodic-rotating-file-handler)가 다음과 같이 정의되어 있다.

<subsystem xmlns="urn:jboss:domain:logging:1.2">
  <console-handler name="CONSOLE">
    <level name="INFO"/>
    <formatter>
      <pattern-formatter pattern="%K\{level}%d\{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
    </formatter>
  </console-handler>
  <periodic-rotating-file-handler name="FILE" autoflush="true">
    <formatter>
      <pattern-formatter pattern="%d\{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
    </formatter>
    <file relative-to="jboss.server.log.dir" path="server.log"/>
    <suffix value=".yyyy-MM-dd"/>
    <append value="true"/>
  </periodic-rotating-file-handler>
  <logger category="com.arjuna">
    <level name="WARN"/>
  </logger>

  … 생략 …

</subsystem>

standalone.xml 파일에 기본 설정된 로그 핸들러 정보

주기적 로테이팅 파일 핸들러

periodic-rotating-file-handler의 로테이션 간격은 suffix 파라미터의 값을 변경하여 지정한다. suffix에서 설정하는 문자는 ‘java.text.SimpleDateFormat’에서 사용하는 형식이다. 로테이션 간격을 지정하는 Suffix 설정 값은 아래 표와 같다.

지정 패턴 입력 값

월 단위

. yyyy-MM

주 단위

. yyyy-ww

일 단위

. yyyy-MM-dd

AM/PM

. yyyy-MM-dd-a

시간 단위

. yyyy-MM-dd-HH

표 5. 파일 핸들러 로테이팅 간격

  • 다음 예제는 suffix를 ‘.yyyy-ww’로 변경하여 주단위로 로테이팅하도록 변경하는 것이다.

    [standalone@localhost:9999 /] cd /subsystem=logging/periodic-rotating-file-handler=FILE
    
    [standalone@localhost:9999 periodic-rotating-file-handler=FILE] :read-attribute(name=suffix)
    
    {
      "outcome" => "success",
      "result" => ".yyyy-MM-dd"
    }
    
    [standalone@localhost:9999 periodic-rotating-file-handler=FILE] :write-attribute(name=suffix,value=".yyyy-ww")
    
    {"outcome" => "success"}

사이즈 로테이팅 파일 핸들러

다음의 예제에서는 주기적 로테이팅 로그 핸들러로 설정되어 있는 설정을 삭제하고 size-rotating-file-handler를 추가한다.

[standalone@localhost:9999 /] cd /subsystem=logging/periodic-rotating-file-handler=FILE

[standalone@localhost:9999 periodic-rotating-file-handler=FILE] :remove

{"outcome" => "success"}

[standalone@localhost:9999 /] /subsystem=logging/size-rotating-file-handler=FILE:add(file=\{"path"=>"server.log","relative-to"=>"jboss.server.log.dir"},rotate-size="100m",max-backup-index=10)

{"outcome" => "success"}

예제에서 로그 파일을 로테이팅하는 크기와 백업파일의 개수를 지정하였다. 로테이팅할 파일 사이즈를 rotate-size 파라미터로 설정하였고, 백업 파일개수를 max-backup-index 파라미터로 지정한다. 예제에서 100m로 ‘m’을 사용하여 ‘메가바이트’ 단위로 지정하였고,’k’, ‘g’를 사용하여 킬로바이트나 기가바이트 단위로 지정할 수 있다.

핸들러의 append 설정

JBoss 에 기본적으로 설정된 핸들러는 서버 시작 시에 기존의 로그 파일에 덧붙여 쓰도록 설정되어 있다.

기존의 로그 파일에 덧붙여 쓰는 것이 아니라, 신규에 로그 파일을 작성하려면 FILE 핸들러의 append 값을 ‘false’로 설정하면 된다. 이렇게 설정하면 기존의 로그 파일은 삭제되고 새로운 파일이 만들어진다. 설정 방법은 다음과 같다.

[standalone@localhost:9999 /] cd /subsystem=logging/periodic-rotating-file-handler=FILE

[standalone@localhost:9999 periodic-rotating-file-handler=FILE] :write-attribute(name=append,value="false")

{
  "outcome" => "success",
  "response-headers" => \{
    "operation-requires-reload" => true,
    "process-state" => "reload-required"
  }
}

일반적으로 운영환경에서 장애 발생시 재시작으로 인하여 기존의 로그가 삭제되지 않게 하려면 append 는 ‘true’로 설정하여야 한다.

콘솔 로그

서버 인스턴스는 standalone.sh 시작하려면 스크립트를 실행한다. 도메인 모드에서는 domain.sh를 시작하면 프로세스 컨트롤러, 호스트 컨트롤러와 서버 인스턴스가 시작된다. 이때 표준 출력에 콘솔 로그가 출력된다. 콘솔 로그에는 서버 장애 상황에서 서버의 스레드 덤프 등 장애 분석에 유용한 로그가 출력되기 때문에 파일에 리다이렉트하여 관리하는 것이 좋다.

또, 운영환경에서 서버 인스턴스는 백그라운드로 실행하여야 해서 다음과 같은 방법으로 서버를 시작한다.

$ nohup ./standalone.sh >> nohup.out 2>&1 &

도메인 모드를 시작할 때도 마찬가지이다.

$ nohup ./domain.sh >> nohup.out 2>&1 &

15-2.애플리케이션 로그 출력

JBoss EAP 6의 로그를 관리하고 있는 JBoss LogManager에서는 내부적으로 JBoss Logging이라는 로그 출력 프레임워크를 사용하고 있다. 애플리케이션에서 이 로깅 프레임워크를 사용하여 애플리케이션 로그를 출력할 수 있다. 이렇게 사용하려면, 개발 시 JBoss Logging 프레임워크를 사용하여 개발해야 한다.

JBoss Logging를 사용한 로그 출력

JBoss의 Logging는$JBOSS_HOME/module 아래에 있는 jboss-logging-3.1.2.GA-redhat-1.jar를 사용한다. 이 라이브러리는 JBoss의 모듈이기 때문에 애플리케이션에 넣을 필요없이 컴파일에만 이용한다.

메이븐 pom.xml파일에서 다음과 같이 <scope>를 provided로 설정하면 패키징하지 않고 컴파일 시에만 사용한다.

<dependency>
  <groupId>org.jboss.logging</groupId>
  <artifactId>jboss-logging</artifactId>
  <version>3.1.2.GA-redhat-1</version>
  <scope>provided</scope>
</dependency>

코드에서 로그를 출력할 때는 org.jboss.logging.Logger 클래스를 사용한다.

package com.opennaru.logtest;
import org.jboss.logging.Logger;

public class LoggerTest {
  private static final Logger logger = Logger.getLogger(LoggerTest.class.getName());

  public void testLog() {
    logger.info("info message");
    logger.debug("debug message");
  }
}

애플리케이션 로그 설정

애플리케이션에서 JBoss Logging를 사용해 로그를 출력하는 경우, 기본적으로 server.log에 출력되어 서버 로그와 애플리케이션 로그가 함께 출력된다. 서버 로그와 애플리케이션 로그를 분리하려면, JBoss의 로그 설정을 변경하여야 한다.

로그 파일을 나누는 경우, 로그 로테이션이나 로그 삭제에 대해서도 서버 로그와 구별이 되기 때문에 애플리케이션을 위한 별도의 핸들러와 로거를 설정해야 한다. 애플리케이션에서 설정은 필요 없고, JBoss EAP 6의 로그 설정만 하면 된다.

애플리케이션용 로그 파일을 나누기 위한 설정 방법은 아래와 같다.

  • 애플리케이션용 파일 핸들러(periodic-rotating-file-handler) 추가

    [standalone@localhost:9999 /] /subsystem=logging/periodic-rotating-file-handler=
    
    tpcw/:add(suffix=.yyyy-MM-dd, autoflush=true, append=true, file=
    
    {"relative-to" => "jboss.server.log.dir","path" => "opennaru.log"})
    
    {"outcome" => "success"}
    
    [standalone@localhost:9999 /] cd /subsystem=logging/periodic-rotating-file-handler=opennaru
    
    [standalone@localhost:9999 periodic-rotating-file-handler=opennaru] :write-attribute(name=encoding, value=UTF-8)
    
    {"outcome" => "success"}
    
    [standalone@localhost:9999 periodic-rotating-file-handler=opennaru] :write-attribute(name=formatter, value="%d %-5p [%c\{1}](%t) - %m%n")
    
    {"outcome" => "success"}
  • 애플리케이션용 카테고리 등록

    [standalone@localhost:9999 /] */subsystem=logging/logger=com.opennaru/:add(level=INFO, handlers=["opennaru"], use-parent-handlers=false)*
    
    {"outcome" => "success"}
  • 설정된 로깅 서브시스템 설정 파일

    <subsystem xmlns="urn:jboss:domain:logging:1.1">
      ... 생략 ...
    
      <periodic-rotating-file-handler name="opennaru" autoflush="true">
        <encoding value="UTF-8"/>
        <formatter>
          <pattern-formatter pattern="%d %-5p [%c\{1}](%t) - %m%n"/>
        </formatter>
        <file relative-to="jboss.server.log.dir" path="opennaru.log"/>
        <suffix value=".yyyy-MM-dd"/>
        <append value="true"/>
      </periodic-rotating-file-handler>
    
      ... 생략 ...
    
      <logger category="com.opennaru" use-parent-handlers="false">
        <level name="INFO"/>
        <handlers>
          <handler name="opennaru"/>
        </handlers>
      </logger>
      ... 생략 ...
    
    </subsystem>

애플리케이션에서 Log4j를 사용하는 경우

대부분의 애플리케이션은 Log4j와 같은 별도의 로깅 프레임워크를 사용하여 개발한다. 배포 시 JBoss EAP 6의 배포 스캐너가 애플리케이션에 포함된 Log4j 설정을 찾아 JBoss의 LogManager에서 처리한다. 이렇게 되면 애플리케이션의 Log4j 설정에 지정된 로그 파일에 남는 것이 아니라 JBoss의 로그 핸들러 파일에 남는다.

이 방식을 설정하는 옵션이 ‘org.jboss.as.logging.per-deployment’이다. 기본값은 true이다.

false로 설정하면 배포 스캐너가 Log4j 설정을 찾지 않고, 로깅 기능을 애플리케이션에서 실행할 수 있도록 한다.

애플리케이션에서 Log4j를 사용하는 경우가 대부분이기 때문에 항상 다음 옵션을 사용할 것을 권장한다.

export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.as.logging.per-deployment=false "

애플리케이션에서 Log4j JAR와 JBoss의 Log4j가 충돌하는 현상이 발생하면 다음과 같이 jboss-deployment-structure.xml을 사용하여 JBoss EAP 6가 제공하는 Logging 프레임워크 모듈을 제외시켜야 한다. 이 설정은 JBoss EAP 6.1이후 버전부터는 사용할 필요가 없다.

<?xml version="1.0" encoding="UTF-8"?>

<jboss-deployment-structure>
  <deployment>
    <exclusions>
      <module name="org.apache.log4j" />
    </exclusions>
  </deployment>
</jboss-deployment-structure>

15-3.도메인 로그

도메인 모드에서는 프로세스 컨트롤러와 호스트 컨트롤러(도메인 컨트롤러) 간의 통신 시 연결이 끊어지거나, 서버의 시작 및 정지, 관리 오퍼레이션을 실행할 때 로그 파일에 출력한다.

도메인 모드에서 서버와 컨트롤러 프로세스가 출력하는 로그 파일은 다음 표와 같다.

로그 파일 설명

$JBOSS_HOME/domain/log/host-controller/boot.log

호스트 컨트롤러 부팅 로그 파일

$JBOSS_HOME/domain/log/process-controller/boot.log

프로세스 컨트롤러 부팅 로그 파일

$JBOSS_HOME/domain/servers/$SERVER_NAME/log/boot.log

지정된 서버의 서버 부팅 로그 파일

$JBOSS_HOME/domain/servers/$SERVER_NAME/log/server.log

지정된 서버가 시작된 이후 모든 로그 메시지가 기록되는 파일

표 6. 도메인 모드의 로그 파일 위치

도메인 모드에서 서버는 스탠드얼론 모드와 마찬가지로 boot.log, server.log에 로그를 출력한다. 로그의 출력 내용이나 로그 설정은 스탠드얼론 모드와 같고 로그 출력 위치는 ‘$jboss.domain.servers.dir/서버명/log’이다.

호스트 컨트롤러의 로그 레벨

도메인 모드의 호스트 컨트롤러와 프로세스 컨트롤러의 로그 레벨은 logging.properties파일에서 지정한다.

logging.properties 파일에 다음과 같이 환경변수를 사용할 수 있도록 설정되어 있다.

# Root logger level

logger.level=${jboss.boot.server.log.level:INFO}

도메인을 시작할 때 다음과 같이 시스템 환경변수를 지정하여 컨트롤러 프로세스의 로그 레벨을 변경할 수 있다. 이 설정을 변경하면, 프로세스 컨트롤러와 호스트 컨트롤러의 로그 출력 레벨이 모두 변경된다.

./domain.sh -Djboss.boot.server.log.level=DEBUG