본문으로 건너뛰기

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>