SLF4J 설정

SLF4J

  • logging 관련 라이브러리는 다양하다.
  • 이러한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법을 SLF4J는 제공한다.
  • SLF4J는 로깅 Facade이다.
  • 로깅에 대한 추상 레이어를 제공하는 것이고 interface의 모음이다.

SLF4J를 이용해 로깅 라이브러리 사용

maven에 SLF4J와 logback 의존성 추가

	<!-- SLF4J, logback -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.25</version>
	</dependency>

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

	<!-- spring -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>${spring.version}</version>
		<exclusions>
			<exclusion>
				<groupId>commons-logging</groupId>
				<artifactId>commons-logging</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	
	<!-- jcl-over-slf4j : commons-logging를 제거해서 생긴 오류를 제거 -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jcl-over-slf4j</artifactId>
		<version>1.7.25</version>
	</dependency>
  • 참고로 logback-classic 1.2.3은 이미 slf4j-api 1.7.25에 대한 의존성을 가지고 있기 때문에 slf-j-api를 추가할 필요는 없다.
  • Spring은 기본적으로 아파치 재단의 commons-logging을 사용한다.
  • logback라이브러리를 사용하려면 commons-logging를 제거 해야한다.
  • Spring라이브러리에서 commons-logging을 제거하면, Spring을 사용할 때 commons-logging라이브러리를 찾으면서 오류가 발생한다.
  • 이러한 오류를 제거하기 위해서 jcl-over-slf4j를 추가한다.

logback 설정

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/tmp/access.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/tmp/access-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
    </appender>

    <logger name="org.springframework" level="info"/>
    <logger name="kr.or.connect" level="debug"/>

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

Appender 설정

  • ConsoleAppender : 콘솔에 로그를 어떤 포맷으로 출력할지를 설정할 때 사용한다.
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
	<encoder>
		<Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
	</encoder>
</appender>
  • FileAppender : 파일에 로그를 어떤 포맷으로 출력할지를 설정한다.
  • RollingFileAppender : 로그의 양이 많아지면, 하나의 파일로 관리하기 어려워지는 경우가 생긴다. 이런 문제를 해결하기 위해 하루 단위로 로그를 관리하고자 할 경우 사용된다.
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
	<file>access.log</file>
	<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>access-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern>
        </encoder>
</appender>

Log Level

  • ex. info 레벨이 설정되면 info 이상의 레벨인 info, warn, error에 대한 로그가 기록됨
  • Level이 높을수록 심각한 오류를 의미
  1. trace : debug보다 세분화된 정보
  2. debug : 디버깅하는데 유용한 세분화된 정보
  3. info : 진행상황 같은 일반 정보
  4. warn : 오류는 아니지만 잠재적인 오류 원인이 될 수 있는 경고성 정보
  5. error : 요청을 처리하는 중 문제가 발생한 오류 정보

logger 설정

<logger name="org.springframework" level="info"/>
<logger name="kr.or.connect" level="debug"/>
  • org.springframework로 시작하는 패키지에 속한 클래스에서 출력하는 로그는 info 레벨이 설정되면 info 이상의 레벨인 info, warn, error에 대한 로그를 기록하라는 의미

root 설정

<root level="debug">
	<appender-ref ref="CONSOLE"/>
	<appender-ref ref="FILE"/>
</root>
  • root 테그에 설정하면 모든 대상에 대해 CONSOLE과 FILE Appender를 적용하라는 의미.
  • 즉, 콘솔과 파일 양쪽에 로그 출력

Logger 객체 선언

  • 로그를 남기고자 하는 클래스에 로거 객체를 필드로 선언한다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

...
    
private Logger logger = LoggerFactory.getLogger(this.getClass());

로그 출력 메서드

  • 문자열 결합을 위해 '+'연산자를 사용하지 않는다.(성능 저하)
  • 로그로 남길 변수의 수만큼 {}를 이용한다.
  • 로그의 수준에 따라 debug(), info(), warn(), error() 메서드를 이용한다.
logger.trace("{} {} 출력", "값1", "값2");
logger.debug("{} {} 출력", "값1", "값2");
logger.info("{} {} 출력", "값1", "값2");
logger.warn("{} {} 출력", "값1", "값2");
logger.error("{} {} 출력", "값1", "값2");

생각해보기

Q. 개발하는 컴퓨터에서 웹 어플리케이션을 실행할 때와 운영환경에서 웹 어플리케이션을 실행할 때 로그를 남기는 방법이 다릅니다. 개발할 때는 콘솔에 로그를 출력하는 것이 편하지만 실제 운영을 할 경우에는 파일로 로그릴 기록하는 것이 좋습니다. 이렇게 환경에 따라서 다른 설정파일을 사용하는 경우가 종종 있습니다. 이런 경우 설정파일을 어떻게 관리하는 것이 좋을까요?

  • 용도에 따라 폴더별로 나누어서 관리합니다. 용도에 따른 분류 기준은 찾으시면 나오겠지만 간단하게 이야기 드리면 다음과 같습니다.
    local(개인개발), dev(공통개발), stage(운영과 동일한 테스트 환경), production(운영)

좋은 웹페이지 즐겨찾기