SLF4J 설정

oyeon·2021년 3월 15일
1

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(운영)
profile
Enjoy to study

0개의 댓글

관련 채용 정보