이전글



Logback 라이브러리 추가하기
Logback 설정에 앞서 다음의 라이브러리 파일들이 필요합니다. logback-classiclogback-core가 필요하며 logbackslf4j의 api를 구현하므로 slf4j-api 도 필요합니다.
logback-classic.x.x.x.jar
logback-core.x.x.x.jar
slf4j-api-x.x.x.jar
cs


위의 라이브러리들을 내려받고 classpath 경로에 추가합니다. 불편하더라도 각각의 .jar파일들을 공식 홈페이지에서 내려받습니다.
logback 관련 jar 다운로드 경로 - https://logback.qos.ch/download.html
slf4j 관련 jar 다운로드 경로 -  https://www.slf4j.org/download.html



메이븐 사용시
메이븐을 사용하는 경우에는 pom.xml<dependencies> 설정으로 다음의 <dependency> 설정만 추가하면 됩니다. 
<dependency>
     <groupId>ch.qos.logback</groupId>
     <artifactId>logback-classic</artifactId>
     <version>1.0.13</version>
</dependency>
cs



테스트 클래스 작성
이클립스를 기준으로 프로젝트를 생성하고 라이브러리를 추가한 후에 LoggerTest.java라는 클래스를 작성하였습니다.



LoggerTest.java 코드는 다음과 같습니다.
package dololak;
 
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
 
public class LoggerTest {
     public static void main(String[] args) {
         //패키지 경로를 포함한 클래스명 또는 .class를 통해  Logger를 얻는다.
         Logger logger = LoggerFactory.getLogger("dololak.LoggerTest");
//       Logger logger = LoggerFactory.getLogger(LoggerTest.class);
         logger.debug("Hello world.");
     }
}
cs


프로젝트에 정상적으로 라이브러리를 설정해 두었다면 코드 실행 결과는 다음과 같을것입니다. 실행 시간대나 패키지명에 따라 다르게 출력될 수 있지만 Hello world 라는 로그가 출력됩니다.
13:24:38.457 [main] DEBUG dololak.LoggerTest - Hello world.
cs


먼저 logging을 하기 위해 Logger 객체를 얻어야 하는데 static 메서드인 LoggerFactory.getLogger() 메서드를 통해 얻을 수 있습니다. getLogger() 메서드에는 얻고자 하는 Logger명을 지정해 주어야 합니다.
 
패키지 경로를 포함한 클래스명 또는 클래스.class를 전달하여 얻을 수 있습니다. 프로젝트에는 slf4j-api를 구현한 logback을 등록해 두었기 때문에 LoggerFactory.getLogger()는 내부적으로 logback이 구현한 Logger 타입의 인스턴스를 돌려줄것입니다.
Logger logger = LoggerFactory.getLogger("dololak.LoggerTest"); 또는
Logger logger = LoggerFactory.getLogger(LoggerTest.class);
cs


위의 코드의 import문을 보면 알겠지만 모두 org.slf4j의 클래스만을 사용한것을 볼 수 있습니다. logback은 slf4j API를 구현하였기 때문에 logback 클래스를 직접적으로 사용하지 않고도 logback을 사용하여 로깅을 할 수 있습니다. 이렇게 하면 slf4j를 구현한 다른 로깅 프레임워크를 사용하게 되더라도 이식하기가 편하고 어플리케이션(slf4j를 사용하는)은 slf4j에 대한 스펙만 알면 된다는 장점이 있습니다.




Logback 설정 파일이 없는데 어떻게 로그가 출력되었나?
Logback에서는 다음과 같은 우선순위로 설정을 참고합니다.

1. classpath 경로에 logback-test.xml이 있는지 확인하고 있으면 그것을 logback 설정으로 사용합니다.
2. classpath 경로에 logback.groovy가 있는지 확인하고 있으면 그것을 logback 설정으로 사용합니다.
3. classpath 경로에 logback.xml이 있는지 확인하고 있으면 그것을 logback 설정으로 사용합니다.
4. 만약 모두 찾지 못했다면 기본 설정인 BasicConfigurator를 사용합니다.

더욱 자세한 내용은  https://logback.qos.ch/manual/configuration.html 를 참고합니다.




설정파일이 없는 경우 사용되는 BasicConfigurator 전략
logback 설정을 따로 하지 않는 경우 기본 설정을 참고하게 되는데, 콘솔로 로그를 출력하는 ConsoleAppender를 사용하며, 출력 패턴은 아래와 같은 포맷을 사용하게 됩니다.
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
cs



Logback XML 설정하기(logback.xml)
앞서 설명했지만 Logback은 어플리케이션에 설정되어있는 classpath 경로상에 logback-test.xml, logback.groovy, logback.xml 파일이 있는지 검사하여 존재하는 경우 우선순위에 따라 설정파일로 사용합니다.

보통은 logback.xml파일을 classpath 경로에 작성해 두고 사용합니다.(예를 들어 myapp/src/main/resources/logback.xml 등으로 작성해 둘 수 있습니다.)
여튼 가장 심플하고 기본적인 설정 내용은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
 
 
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
cs



Appender 설정
logback 설정은 <configuration>태그 하위에 작성합니다. <appender>는 Appender에 관한 설정으로 로그 출력 대상에 대한 설정입니다. 종류에 따라 로그파일이 될수도 있고, 콘솔(터미널)이 될수도 있고, 네트워크상의 다른 어플리케이션이나 DBMS일수도 있습니다. 여기서는 콘솔에 로그를 출력하기 위한 ConsoleAppender를 설정했습니다.

자세한 설명은 다음의  https://logback.qos.ch/manual/appenders.html 경로를 참고합니다.



출력 패턴(pattern) 설정
<pattern>PatternLayoutEncoder를 통해 로그를 출력할 때 로그 출력 패턴 형식을 지정할 수 있습니다.
예를 들어 %d{시간형식} 등 입니다.
자세한 설명은 https://logback.qos.ch/manual/layouts.html 경로를 참고합니다.


Root Logger
<root> 설정은 루트 Logger 에 대한 설정입니다.
로거(Logger)는 logback 안에 여러개가 설정될 수 있습니다. 하나의 어플리케이션이라고 하더라도 패키지별 또는 기능별로 다른 로그파일에 출력한다든지 오류는 A.log 파일에, 기본 로그는 콘솔에 출력한다든지 여러가지의 Logger가 필요할 수 있기 때문입니다.

이후에 시간이 된다면 logback 설정에 대해 자세히 다루어볼 예정인데 <logger> 라는 태그로 여러개의 로거를 설정할 수 있고 각 로거별로 구분할 수 있는 이름(name)을 지정할 수 있습니다.

로거에 설정된 이름(name)은 LoggerFactory.getLogger(logger 이름) 으로 로거를 구해올 때 어떤 로거를 리턴해줄것인지에 대한 구분조건이 됩니다. 
그런데 getLogger()에 지정해준 이름에 해당하는 로거가 존재하지 않는 경우 기본적으로 이 Root Logger가 리턴됩니다.



다음글
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!