1. 개요

Logback 은 Java 커뮤니티에서 가장 널리 사용되는 로깅 프레임워크 중 하나입니다. 그것은이다 그것의 전임자, Log4j를 교체. Logback은 더 빠른 구현을 제공하고 구성을 위한 더 많은 옵션을 제공하며 오래된 로그 파일을 보관할 때 더 많은 유연성을 제공합니다.

이 예제에서는 Logback의 아키텍처를 소개하고 이를 사용하여 애플리케이션을 개선하는 방법을 살펴보겠습니다.

2. 로그백 아키텍처

Logback 아키텍처는 Logger , AppenderLayout 의 세 가지 클래스로 구성 됩니다.

로거는 로그 메시지에 대한 컨텍스트입니다. 애플리케이션이 로그 메시지를 생성하기 위해 상호 작용하는 클래스입니다.

Appender 는 최종 목적지에 로그 메시지를 배치합니다. 로거 개 이상 가질 수 이 appender를 . 우리는 일반적으로 Appender 를 텍스트 파일에 첨부된 것으로 생각 하지만 Logback은 그보다 훨씬 더 강력합니다.

레이아웃 은 출력할 메시지를 준비합니다. Logback은 메시지 형식 지정을 위한 사용자 지정 클래스 생성과 기존 클래스에 대한 강력한 구성 옵션을 지원합니다.

3. 설정

3.1. 메이븐 의존성

Logback은 SLF4J(Simple Logging Facade for Java)를 기본 인터페이스로 사용합니다. 메시지 로깅을 시작하기 전에 pom.xml에 Logback 및 SLF4J를 추가해야 합니다 .

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
    <scope>test</scope>
</dependency>

Maven Central에는 최신 버전의 Logback Core 와  최신 버전의 slf4j-api가 있습니다.

3.2. 클래스패스

Logback은 또한 런타임을 위한 클래스 경로에 logback-classic.jar이  필요 합니다.

이것을 pom.xml 에 테스트 의존성으로 추가합니다 .

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

4. 기본 예 및 구성

애플리케이션에서 Logback을 사용하는 간단한 예부터 시작하겠습니다.

먼저 구성 파일이 필요합니다. logback.xml 이라는 텍스트 파일을 만들고 클래스 경로의 어딘가에 넣습니다.

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <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>

다음으로 main 메소드 가 있는 간단한 클래스가 필요합니다 .

public class Example {

    private static final Logger logger 
      = LoggerFactory.getLogger(Example.class);

    public static void main(String[] args) {
        logger.info("Example log from {}", Example.class.getSimpleName());
    }
}

이 클래스는 Logger를 만들고  info()호출  하여 로그 메시지를 생성합니다.

Example 을 실행  하면 콘솔에 기록된 메시지가 표시됩니다.

20:34:22.136 [main] INFO Example - Example log from Example

Logback이 왜 그렇게 인기가 있는지 쉽게 알 수 있습니다. 몇 분 안에 작동합니다.

이 구성과 코드는 작동 방식에 대한 몇 가지 힌트를 제공합니다.

  1. ConsoleAppender 라는 클래스 이름을 참조하는 STDOUT 이라는 이름 appender  가 있습니다 .
  2. 로그 메시지의 형식을 설명하는 패턴이 있습니다.
  3. 우리 코드는 로거를 생성하고  info() 메소드 를 통해 메시지를 전달했습니다  .

이제 기본 사항을 이해했으므로 자세히 살펴보겠습니다.

5. 로거 컨텍스트

5.1. 컨텍스트 생성

Logback에 메시지를 기록하려면 SLF4J 또는 Logback에서 Logger초기화합니다 .

private static final Logger logger 
  = LoggerFactory.getLogger(Example.class);

그런 다음 우리는 그것을 사용합니다:

logger.info("Example log from {}", Example.class.getSimpleName());

이것은 우리의 로깅 컨텍스트입니다. 생성할 때 클래스를 LoggerFactory에 전달 했습니다 . 이것은 Logger 에 이름을 부여합니다 ( String 을 허용하는 오버로드도 있습니다 ). 

로깅 컨텍스트는 Java 객체 계층 구조와 매우 유사한 계층 구조에 존재합니다.

  1. 로거 뒤에 도트는 이름, 하위 접두사 때 조상 로거 의 이름
  2. 로거는 그와 아이 사이의 조상이없는 경우 부모입니다

예를 들어 아래 예제 클래스는 com.baeldung.logback 패키지에 있습니다. com.baeldung.logback.appenders 패키지 에는 ExampleAppender 라는 또 다른 클래스가 있습니다  .

ExampleAppender의 LoggerExample의 Logger의 자식입니다 .

모든 로거 는 사전 정의된 루트 로거의 자손입니다.

로거 보유 수준, 구성을 통해 하나 또는로 설정 될 수있다  ()는 Logger.setLevel. 코드에서 수준을 설정하면 구성 파일이 재정의됩니다.

가능한 수준은 우선 순위에 따라 TRACE, DEBUG, INFO, WARNERROR입니다.  각 수준에는 해당 수준에서 메시지를 기록하는 데 사용하는 해당 방법이 있습니다.

로거 에 레벨이 명시적으로 할당되지 않은 경우 가장 가까운 조상의 레벨을 상속합니다. 루트 로거의 기본값은  DEBUG입니다. 아래에서 이를 재정의하는 방법을 살펴보겠습니다.

5.2. 컨텍스트 사용

로깅 계층 구조 내에서 컨텍스트를 사용하는 방법을 보여주는 예제 프로그램을 만들어 보겠습니다.

ch.qos.logback.classic.Logger parentLogger = 
  (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");

parentLogger.setLevel(Level.INFO);

Logger childlogger = 
  (ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback.tests");

parentLogger.warn("This message is logged because WARN > INFO.");
parentLogger.debug("This message is not logged because DEBUG < INFO.");
childlogger.info("INFO == INFO");
childlogger.debug("DEBUG < INFO");

이것을 실행하면 다음 메시지가 표시됩니다.

20:31:29.586 [main] WARN com.baeldung.logback - This message is logged because WARN > INFO.
20:31:29.594 [main] INFO com.baeldung.logback.tests - INFO == INFO

먼저 com.baeldung.logback 이라는 로거 를 검색하여 ch.qos.logback.classic.Logger 에 캐스트합니다 .

다음 문에서 수준을 설정하려면 Logback 컨텍스트가 필요합니다. SLF4J의 추상 로거setLevel()을 구현하지 않습니다 .

컨텍스트의 수준을 INFO로 설정합니다 . 그런 다음 com.baeldung.logback.tests 라는 다른 로거를 만듭니다 .

마지막으로 계층 구조를 보여주기 위해 각 컨텍스트와 함께 두 개의 메시지를 기록합니다. Logback은 WARN  및 INFO 메시지를 기록하고 DEBUG  메시지를 필터링 합니다.

이제 루트 로거를 사용하겠습니다.

ch.qos.logback.classic.Logger logger = 
  (ch.qos.logback.classic.Logger)LoggerFactory.getLogger("com.baeldung.logback");
logger.debug("Hi there!");

Logger rootLogger = 
  (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
logger.debug("This message is logged because DEBUG == DEBUG.");

rootLogger.setLevel(Level.ERROR);

logger.warn("This message is not logged because WARN < ERROR.");
logger.error("This is logged.");

이 스니펫을 실행할 때 다음 메시지가 표시됩니다.

20:44:44.241 [main] DEBUG com.baeldung.logback - Hi there!
20:44:44.243 [main] DEBUG com.baeldung.logback - This message is logged because DEBUG == DEBUG.
20:44:44.243 [main] ERROR com.baeldung.logback - This is logged.

요약하자면, Logger 컨텍스트로 시작 하여 DEBUG 메시지를 출력했습니다 .

그런 다음 정적으로 정의된 이름을 사용하여 루트 로거를 검색하고 해당 수준을 ERROR로 설정했습니다 .

마지막으로, 우리는 Logback이 실제로 오류보다 적은 문장을 필터링한다는 것을 시연했습니다.

5.3. 매개변수화된 메시지

위의 샘플 조각에 있는 메시지와 달리 가장 유용한 로그 메시지에는 문자열을 추가해야 합니다 . 여기에는 메모리 할당, 개체 직렬화, 문자열 연결 , 나중에 가비지 정리가 수반  됩니다.

다음 메시지를 고려하십시오.

log.debug("Current count is " + count);

Logger  가 메시지를 기록 하는지 여부에 관계없이 메시지 작성 비용이 발생합니다 .

Logback은 매개변수화된 메시지로 대안을 제공합니다.

log.debug("Current count is {}", count);

중괄호 {}는 모든 Object 를 허용 하고 해당 toString() 메서드를 사용하여 로그 메시지가 필요한지 확인한 후에만 메시지를 빌드합니다.

몇 가지 다른 매개변수를 시도해 보겠습니다.

String message = "This is a String";
Integer zero = 0;

try {
    logger.debug("Logging message: {}", message);
    logger.debug("Going to divide {} by {}", 42, zero);
    int result = 42 / zero;
} catch (Exception e) {
    logger.error("Error dividing {} by {} ", 42, zero, e);
}

이 스니펫은 다음을 생성합니다.

21:32:10.311 [main] DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String
21:32:10.316 [main] DEBUG com.baeldung.logback.LogbackTests - Going to divide 42 by 0
21:32:10.316 [main] ERROR com.baeldung.logback.LogbackTests - Error dividing 42 by 0
java.lang.ArithmeticException: / by zero
  at com.baeldung.logback.LogbackTests.givenParameters_ValuesLogged(LogbackTests.java:64)
...

우리는 어떻게 볼 문자열, INT, 그리고 정수가 매개 변수로 전달 될 수있다.

또한 예외 가 로깅 메소드의 마지막 인수로 전달되면 Logback은 스택 추적을 인쇄합니다.

6. 세부 구성

이전 예에서는 섹션 4 에서 만든 11줄 구성 파일 을 사용하여 콘솔에 로그 메시지를 인쇄했습니다. 이것은 Logback의 기본 동작입니다. 구성 파일을 찾을 수 없으면 ConsoleAppender를  만들고 루트 로거와 연결합니다.

6.1. 구성 정보 찾기

구성 파일을 클래스 경로에 배치하고 logback.xml  또는  logback-test.xml로 이름을 지정할 수 있습니다  .

Logback이 구성 데이터를 찾는 방법은 다음과 같습니다.

  1. 클래스 경로에서 logback-test.xml , logback.groovy  또는 logback.xml 파일 을 순서대로 검색합니다.
  2. 라이브러리가 해당 파일 을 찾지 못하면 Java의 ServiceLoader사용 하여 com.qos.logback.classic.spi.Configurator 의 구현자를 찾으려고 시도합니다 .
  3. 콘솔에 직접 출력을 기록하도록 자체 구성

참고: 현재 버전의 Logback은 Java 9와 호환되는 Groovy 버전이 없기 때문에 Groovy 구성을 지원하지 않습니다.

6.2. 기본 구성

예제 구성을 자세히 살펴보겠습니다 .

전체 파일은  <configuration>  태그에 있습니다.

ConsoleAppender 유형  Appender 를 선언 하고 이름을 STDOUT으로 지정  하는 태그가 표시  됩니다. 해당 태그 내에 중첩된 인코더가 있습니다. sprintf 스타일의 이스케이프 코드 처럼 보이는 패턴이  있습니다.

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
</appender>

마지막으로 루트 태그가 표시됩니다. 이 태그는 루트 로거를 DEBUG 모드로 설정  하고 출력을 STDOUT 이라는  Appender 와 연결합니다 .

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

6.3. 구성 문제 해결

로그백 구성 파일은 복잡해질 수 있으므로 문제 해결을 위한 몇 가지 기본 제공 메커니즘이 있습니다.

Logback이 구성을 처리할 때 디버그 정보를 보려면 디버그 로깅을 켤 수 있습니다.

<configuration debug="true">
  ...
</configuration>

Logback은 구성을 처리할 때 콘솔에 상태 정보를 인쇄합니다.

23:54:23,040 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback-test.xml] 
  at [file:/Users/egoebelbecker/ideaProjects/logback-guide/out/test/resources/logback-test.xml]
23:54:23,230 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender 
  of type [ch.qos.logback.core.ConsoleAppender]
23:54:23,236 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
23:54:23,247 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type 
  [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
23:54:23,308 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
23:54:23,309 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
23:54:23,310 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
23:54:23,313 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@5afa04c - Registering current configuration 
  as safe fallback point

구성 파일을 구문 분석하는 동안 경고나 오류가 발생하면 Logback은 콘솔에 상태 메시지를 기록합니다.

상태 정보를 인쇄하는 두 번째 메커니즘이 있습니다.

<configuration>
    <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" />  
    ...
</configuration>

StatusListener 차단 상태 메시지 및 구성 중에 인쇄물을뿐만 아니라, 프로그램이 실행되는 동안 .

모든 구성 파일의 출력이 인쇄되어 클래스 경로에서 "불량" 구성 파일을 찾는 데 유용합니다.

6.4. 자동으로 구성 다시 로드

응용 프로그램이 실행되는 동안 로깅 구성을 다시 로드하는 것은 강력한 문제 해결 도구입니다. 로그백은 스캔 매개변수를 사용하여 이를 가능하게 합니다  .

<configuration scan="true">
  ...
</configuration>

기본 동작은 60초마다 구성 파일의 변경 사항을 스캔하는 것입니다. scanPeriod 를 추가하여 이 간격을 수정할 수 있습니다 .

<configuration scan="true" scanPeriod="15 seconds">
  ...
</configuration>

밀리초, 초, 분 또는 시간 단위로 값을 지정할 수 있습니다.

6.5. 로거 수정

위의 샘플 파일에서 루트 로거의 수준을 설정하고 이를 콘솔 Appender 와 연결했습니다  .

모든 로거에 대한 수준을 설정할 수 있습니다 .

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="com.baeldung.logback" level="INFO" /> 
    <logger name="com.baeldung.logback.tests" level="WARN" /> 
    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

이것을 클래스 경로에 추가하고 코드를 실행해 보겠습니다.

Logger foobar = 
  (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.foobar");
Logger logger = 
  (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback");
Logger testslogger = 
  (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.logback.tests");

foobar.debug("This is logged from foobar");
logger.debug("This is not logged from logger");
logger.info("This is logged from logger");
testslogger.info("This is not logged from tests");
testslogger.warn("This is logged from tests");

다음 출력이 표시됩니다.

00:29:51.787 [main] DEBUG com.baeldung.foobar - This is logged from foobar
00:29:51.789 [main] INFO com.baeldung.logback - This is logged from logger
00:29:51.789 [main] WARN com.baeldung.logback.tests - This is logged from tests

프로그래밍 방식으로 로거 수준을 설정하지 않으면  구성에서 설정합니다. com.baeldung.foobar루트 로거에서  DEBUG상속 합니다.

로거  는 또한 루트 로거에서 appender-ref상속합니다  . 아래에서 볼 수 있듯이 이를 재정의할 수 있습니다.

6.6. 변수 대체

로그백 구성 파일은 변수를 지원합니다. 구성 스크립트 내부 또는 외부에서 변수를 정의합니다. 변수는 값 대신 구성 스크립트의 어느 지점에서나 지정할 수 있습니다.

예를 들어 다음은 FileAppender에 대한 구성입니다  .

<property name="LOG_DIR" value="/var/log/application" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${LOG_DIR}/tests.log</file>
    <append>true</append>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender>

구성의 맨 위에서 LOG_DIR 이라는  속성 을 선언했습니다  . 그런 다음 이를 appender 정의 내부의 파일 경로의 일부로 사용했습니다  .  

속성은 구성 스크립트 <property> 태그에 선언  되지만 시스템 속성과 같은 외부 소스에서도 사용할 수 있습니다. 이 예에서 속성 선언을 생략 하고 명령줄 에서 LOG_DIR 값을  설정할 수 있습니다.

$ java -DLOG_DIR=/var/log/application com.baeldung.logback.LogbackTests

${propertyname} 을 사용하여 속성 값을 지정합니다  . Logback은 변수를 텍스트 대체로 구현합니다. 변수 대체는 값을 지정할 수 있는 구성 파일의 모든 지점에서 발생할 수 있습니다.

7. 어 펜더

로거LoggingEvents 를  Appenders에  전달  합니다. Appender 는 실제 로깅 작업을 수행합니다. 우리는 일반적으로 로깅을 파일이나 콘솔로 가는 것으로 생각하지만 Logback은 훨씬 더 많은 것을 할 수 있습니다. Logback-core 는 몇 가지 유용한 appender를 제공합니다 .

7.1. 콘솔 어펜더

우리는 이미 ConsoleAppender  가 작동하는 것을 보았습니다  . 이름에도 불구하고  ConsoleAppenderSystem.out  또는 System.err 에 메시지를 추가합니다  .

OutputStreamWriter사용  하여 I/O를 버퍼링하므로 이를 System.err 로  지정해도 버퍼링되지 않은 쓰기가 발생하지 않습니다.

7.2. 파일 어펜더

FileAppender  는 파일에 메시지를 추가합니다. 광범위한 구성 매개변수를 지원합니다. 기본 구성에 파일 어펜더추가해 보겠습니다 .

<configuration debug="true">
    <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>

    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>tests.log</file>
        <append>true</append>
        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <logger name="com.baeldung.logback" level="INFO" /> 
    <logger name="com.baeldung.logback.tests" level="WARN"> 
        <appender-ref ref="FILE" /> 
    </logger> 

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

FileAppender을 통해 파일명으로 구성된  <파일>. <APPEND>  태그는 지시  이 appender를  잘라내는보다는 기존 파일에 추가 할. 테스트를 여러 번 실행하면 로깅 출력이 동일한 파일에 추가되는 것을 볼 수 있습니다.

위에서 테스트를 다시 실행하면 com.baeldung.logback.tests의 메시지  가 콘솔과 tests.log라는 파일로 이동합니다. 하위  로거 는 루트 로거와 ConsoleAppender 의 연결을 FileAppender 와의  연결과 함께 상속합니다  . 추가 자는 누적됩니다.

이 동작을 재정의할 수 있습니다.

<logger name="com.baeldung.logback.tests" level="WARN" additivity="false" > 
    <appender-ref ref="FILE" /> 
</logger> 

<root level="debug">
    <appender-ref ref="STDOUT" />
</root>

additivityfalse로 설정   하면 기본 동작이 비활성화됩니다. 테스트 는 콘솔에 기록하지 않으며 그 하위 항목도 기록하지 않습니다.

7.3. RollingFileAppender

종종 동일한 파일에 로그 메시지를 추가하는 것은 우리가 필요로 하는 동작이 아닙니다. 시간, 로그 파일 크기 또는 이 둘의 조합을 기반으로 파일이 "롤"되기를 원합니다.

이를 위해 RollingFileAppender 가 있습니다 .

<property name="LOG_FILE" value="LogFile" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_FILE}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>

        <!-- keep 30 days' worth of history capped at 3GB total size -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender> 

RollingFileAppender는  이  RollingPolicy을.  이 샘플 구성에서 TimeBasedRollingPolicy를 볼 수  있습니다. 

FileAppender와 유사하게  appender 를 파일 이름으로 구성했습니다  . 아래 파일 이름을 재사용할 것이기 때문에 속성을 선언하고 사용했습니다.

RollingPolicy  내부  fileNamePattern을 정의했습니다 .  이 패턴은 파일 이름뿐만 아니라 롤링 빈도도 정의합니다. TimeBasedRollingPolicy  는 가장 미세하게 정의된 기간에 패턴과 롤을 검사합니다.

예를 들어:

<property name="LOG_FILE" value="LogFile" />
<property name="LOG_DIR" value="/var/logs/application" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_DIR}/${LOG_FILE}.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_DIR}/%d{yyyy/MM}/${LOG_FILE}.gz</fileNamePattern>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>

활성 로그 파일은  /var/logs/application/LogFile입니다.  이 파일은 매월 초에 /Current Year/Current Month/LogFile.gz 로 롤오버   되고 RollingFileAppender  는 새 활성 파일을 생성 합니다.

아카이브된 파일의 총 크기가 3GB에 도달하면 RollingFileAppender는 선입  선출 방식으로 아카이브를 삭제합니다.

주, 시, 분, 초, 심지어 밀리초에 대한 코드가 있습니다. Logback은 여기 에 참조가 있습니다 .

RollingFileAppender  는 또한 파일 압축을 기본적으로 지원합니다. LogFile.gz 라는 이름을 지정했기 때문에 롤링된 파일을 압축합니다 .

TimeBasedPolicy  는 파일 롤링에 대한 유일한 옵션이 아닙니다. Logback은 또한 현재 로그 파일 크기와 시간을 기반으로 롤링되는 SizeAndTimeBasedRollingPolicy 를 제공합니다   . 또한 로거가 시작될 때마다 로그 파일 이름을 롤링 하는 FixedWindowRollingPolicy를 제공합니다   .

자체 RollingPolicy를 작성할 수도 있습니다 .

7.4. 커스텀 어 펜더

Logback의 기본 어펜더 클래스 중 하나를 확장 하여 커스텀 어펜더생성할 수 있습니다 . 여기에 사용자 지정 어펜더 를 만드는 방법에 대한 사용방법(예제)가 있습니다 .

8. 레이아웃

레이아웃은 로그 메시지를 형식화합니다. Logback의 나머지 부분과 마찬가지로  레이아웃  은 확장 가능하며 우리가 직접 만들있습니다.  그러나 기본 PatternLayout 은 대부분의 애플리케이션에 필요한 것과 일부를 제공합니다.

지금까지 모든 예제에서 PatternLayout사용했습니다 .

<encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

이 구성 스크립트에는 PatternLayoutEncoder에 대한 구성이 포함되어 있습니다  . Encoder 를  Appender에  전달 하고 이 인코더는  PatternLayout 을 사용하여 메시지 형식을 지정합니다. 

<pattern> 태그 의 텍스트는  로그 메시지의 형식을 정의합니다. PatternLayout  은 패턴 생성을 위한 다양한 변환 단어 및 형식 수정자를 구현합니다.

이것을 분해해 봅시다. PatternLayout 은 %가 있는 변환 단어를 인식하므로 패턴의 변환은 다음을 생성합니다.

  • %d{HH:mm:ss.SSS} – 시간, 분, 초 및 밀리초가 포함된 타임스탬프
  • [%thread] – 대괄호로 묶인 로그 메시지를 생성하는 스레드 이름
  • %-5level – 로깅 이벤트의 레벨, 5자로 채워짐
  • % 로거 {36} -의 이름 로거 , 35 자에서 잘립니다
  • %msg%n – 플랫폼 종속 줄 구분 문자 뒤에 오는 로그 메시지

따라서 다음과 유사한 메시지가 표시됩니다.

21:32:10.311 [main] DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String

변환 단어 및 형식 수정자의 전체 List은 여기 에서 찾을 수 있습니다 .

9. 결론

이 광범위한 기사에서 우리는 애플리케이션에서 Logback을 사용하는 기본 사항을 다뤘습니다.

Logback 아키텍처의 세 가지 주요 구성 요소인 Logger , AppenderLayout 을 살펴보았습니다 . Logback에는 메시지 필터링 및 형식 지정을 위해 구성 요소를 조작하는 데 사용되는 강력한 구성 스크립트가 있습니다. 또한 로그 파일을 생성, 롤오버, 구성 및 압축하기 위해 가장 일반적으로 사용되는 두 가지 파일 추가기에 대해 논의했습니다.

평소와 같이 코드 조각은 GitHub 에서 찾을 수 있습니다 .

 

Generic footer banner