Uncategorized

Logback 설정

일반적으로 logback.xml 이라는 이름으로 만들어 src/main/resources/아래에 위치

spring-boot에서는 Logback을 사용한다. 기존의 logback을 사용해본 사람은 알 것이다. Web Application을 가동하면 classpath 내에서 환경 설정 파일(logback.xml(logback-text.xml))을 검색해서 logback을 초기화시킨다. 이때는 아직 Spring이 구동되기 전의 시점이다. spring-boot에서는 logback-spring.xml을 사용해서 Spring이 logback을 구동할 수 있도록 지원해준다. 덕분에 profile이나 application.xml에 설정된 properties를 읽어올 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml" />
    <include resource="org/springframework/boot/logging/logback/console-appender.xml" />    

    <!-- 변수 지정 -->
    <property name="LOG_DIR" value="/logs" />
    <property name="LOG_PATH_NAME" value="${LOG_DIR}/data.log" />
    <!-- 변수 지정 끝 -->
  
    <!-- Appender 생성 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH_NAME}</file>
        <!-- 일자별로 로그파일 적용하기 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH_NAME}.%d{yyyyMMdd}</fileNamePattern>
            <maxHistory>60</maxHistory> <!-- 일자별 백업파일의 보관기간 -->
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%F]%M\(%L\) : %m%n</pattern>
        </encoder>
    </appender>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%F]%M\(%L\) : %m%n</pattern>
      </layout>
    </appender>
    <!-- Appender 생성 끝 -->

    <!-- Appdender를 어떻게 사용할지 설정 -->
    <!-- TRACE > DEBUG > INFO > WARN > ERROR, 대소문자 구분 안함 -->
    <!-- profile 을 읽어서 appender 을 설정할수 있다.(phase별 파일을 안만들어도 되는 좋은 기능) -->
    <springProfile name="local">
      <root level="DEBUG"> <!-- DEBUG 이상 로그를 남기겠다-->
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
      </root>
    </springProfile>
    <springProfile name="real">
      <logger name="com.example" level="debug" additivity="false"> <!-- 저 클래스 로그를 남기겠다-->
		<appender-ref ref="STDOUT" />
	  </logger>
      <root level="INFO"> <!-- INFO 이상 로그를 남기겠다-->
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
      </root>
    </springProfile>
    <!--Appdender를 어떻게 사용할지 설정 끝 -->
</configuration>

# java 코딩에서의 로깅

실제 사용은 다음과 같이 LoggerFactory를 이용해서 사용하거나 Lombok어노테이션을 활용하면 심플하게 사용이 가능하다.

  • LoggerFactory 사용
1
2
3
4
5
6
7
8
9
10
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {
static final Logger logger = LoggerFactory.getLogger(Foo.class);

public void test() {
logger.debug(“ID : {}”, “foo”);
}
}
  • Lombok 어노테이션 사용
1
2
3
4
5
6
7
8
9
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Foo {

public void test() {
log.debug(“ID : {}”, “foo”);
}
}

* Appender 종류

ConsoleAppender : 콘솔에 로그를 찍는 방법

FileAppender : 파일에 로그를 찍는 방법

RollingFileAppender : 여러개의 파일을 순회하면서 로그를 찍는 방법

SMTPAppender : 로그를 메일에 찍어 보내는 방법

DBAppender : 데이터베이스에 로그를 찍는 방법

기타 SocketAppender, SSLSocketAppender등이 있다.

출처: https://jeong-pro.tistory.com/154 [기본기를 쌓는 정아마추어 코딩블로그]

출처: https://jeong-pro.tistory.com/154 [기본기를 쌓는 정아마추어 코딩블로그]

Appender
로그를 출력 할 위치, 출력 형식 등을 설정할 수 있습니다.
Logback-Core 모듈을 통해 사용할 수 있는 기본적 Appender는 3가지가 있습니다.
1) ConsoleAppender
– 로그를 OutputStream에 write 하여, 최종적으로 콘솔에 출력되도록 합니다.
2) FileAppender
– 로그의 내용을 지정된 File에 기록합니다.
3) RollingFileAppender
– FileAppender로 부터 상속받은 Appender로 날짜, 최대 용량 등을 설정하여 지정한 파일명 패턴에 따라 로그가 다른 파일에 기록되도록 합니다. 이를 이용하여 대량의 로그를 효과적으로 기록할 수 있습니다.
Logback-Core의 기본 Appender 외에도 Logback-Classic 모듈의 다양한 Appender (SSLSocketAppender, SMTPAppender, DBAppender 등)을 사용하여 로그를 원격위치에 기록 할 수도 있습니다.
Appender들의 하위 항목으로 출력 형식(Layout Pattern)을 지정하여 각 Appender마다 원하는 내용을 출력시킬 수 있습니다.
ex) %logger(Logger 이름), %thread(현재 스레드명), %level(로그 레벨), %msg(로그메시지), %n(new line) 등

  1. Logger
    실제 로그 기능을 수행하는 객체로 각 Logger마다 Name을 부여하여 사용합니다.
    각 Logger 마다 원하는 출력 레벨값을 설정할 수 있으며, 0개 이상의 Appender를 지정할 수 있습니다. 각 소스로부터 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달 됩니다.기본적으로 최상위 로거인 Root Logger를 설정해 주어야하며, 추가로 필요한 로거에 대해 String 또는 클래스명 형식으로 Logger Name을 추가하여 사용할 수 있습니다. 또한 Logger의 Name은 .문자를 구분자로 사용하여 계층적으로 활용 할 수 있습니다.

    ex)
     아래와 같이 Root 로거 외에 2개의 로거를 추가했다고 가정해보겠습니다.
Logger Name출력 LevelAppenderAdditivity
RootDEBUGConsole 
VehicleINFO RollingFiletrue
Vehicle.CarERROR Filefalse

REPORT THIS AD

REPORT THIS AD

여기서 Additivity는 상위 Logger로부터의  상속 여부를 의미합니다. True(기본값)일 경우, 먼저 모든 상위 로거들의 설정값을 상속받아 현재 로거에 설정된 값을 재적용(덮어쓰기) 시키며, False로 설정하게 된다면 해당 로거는 상위 로거의 설정내용을 상속받지 않습니다.

즉, Vehicle의 경우 Root 로거로부터 DEBUG 레벨 설정을 상속받지만 현재 로거에 INFO 레벨이 적용되어 있기 때문에 최종적으로 INFO 레벨이 적용되며, Root 로거의 Console Appender와 Vehicle 로거의 RollingFile Appender 모두에게 로그 메시지를 전달하게 됩니다.

Vehicle.Car의 경우 Additivity 값이 false 이기 때문에 상위 로거인 Root, Vehicle 로거로 부터 설정을 상속받지 않아 최종적으로 ERROR 레벨 이상의 로그가 File Appender로 전달되게 됩니다.

만일 Logger 설정되지 않은 클래스명( ex – Vehicle.Airplane)이 입력되었을 경우, 상위 로거인 Vehicle의 설정내용으로 동일하게 적용됩니다.

3-3. 설정파일 예시

아래의 설정파일(logback.xml)을 통해 기본적인 구조를 살펴보겠습니다.

1234567891011121314151617181920212223242526272829303132333435<?xml version="1.0" encoding="UTF-8"?><configuration scan="true" scanPeriod="30 seconds"><property name="LOGS_ABSOLUTE_PATH" value="./logs" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>[%d{yyyy-MM-dd HH:mm:ss}][%-5level][%logger{36}] - %msg%n</pattern></encoder></appender> <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOGS_ABSOLUTE_PATH}/logback.log</file><encoder><pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOGS_ABSOLUTE_PATH}/logback.%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy                  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><!-- or whenever the file size reaches 100MB --><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy></rollingPolicy></appender> <logger name="src.Main"  level="debug" additivity="false"><appender-ref ref="ROLLING" /></logger> <logger name="src.Main.Child" additivity="true" /> <root level="info"><appender-ref ref="STDOUT" /></root> </configuration>

REPORT THIS ADREPORT THIS AD

설정파일의 기본적인 구조는

1234567<configuration> <appender> Appender 설정 </appender> <logger> Logger 설정 </logger> </configuration>

으로 되어 있습니다.

위의 예시 설정파일의 경우 2가지의 Appender(Console, Rollingfile), 3가지의 Logger( Root, src.Main, src.Main.Child)를 사용하였습니다. RollingFileAppender의 경우 먼저 기본 파일명을 경로와 함께 지정하고,  로그 패턴과 Rolling 파일명 패턴을 지정해 주면 됩니다.
예시에서는 먼저 날짜(yyyy-mm-dd)를 기준으로 파일명을 Rolling하고, timeBasedFileNaming
AndTriggerPolicy 항목을 통해 100MB의 용량 제한을 설정하여 Rolling 하도록 하였습니다. 여기서 용량제한을 설정할 경우 파일명 패턴에 %i와 같이 파일명에 변화를 줄 수 있는 인자를 추가해 주어야 합니다.

configuration의 하위 항목으로 scan과 scanPeriod 항목을 추가하여 앞선 개요글에서 설명드렸던 Auto-Reloading 기능을 활성화 시킬 수도 있습니다. 그 외의 설정 내용은 별다른 어려움 없이 이해하실 수 있을 것입니다.

좀더 자세한 설정내용에 대한 내용은 http://logback.qos.ch/manual/configuration.html 에서 확인하실 수 있습니다.

감사합니다!!