CORE
HOME > JAVA > J2SE > CORE
2019.05.29 / 24:53

[로깅] logback을 이용한 로깅 처리

탁돌이개발자
추천 수 54

이 포스팅은 자기성찰의 색이 짙은 포스팅이다.
대학생활을 끝내고 현업자의 생활로 접어든 지금까지도 아직 로그 처리를 있는거 가져다 쓰는 정도로 밖에 모르고 있었다.
System.out.println() 밖에 할 줄 모르던 얼마 전 까지의 나를 일깨우는 차원에서, logback의 역사와 기원 보다는, 사용법 측면에 집중하여 포스팅 해 보도록 하겠다.

[라이브러리 설정]

logback을 사용하기 위해선 logback-classic 라이브러리가 필요하다.
이 라이브러리를 maven에 추가해준다.

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



[logback 설정파일 작성]

logback 을 사용하기 위해서는 classpath 내부에 logback 설정파일이 필요하다.

설정파일은 3가지 방식을 사용할 수 있으며, 번호 순서대로 우선순위를 갖는다.
1. logback.groovy
2. logback-test.xml
3. logback.xml



본 예시에서는 logback.xml 을 작성하도록 하겠다.

[src/main/resources/logback.xml]

<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- 콘솔 출력 (stdout) --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender> <!-- 일별 파일로 저장 --> <appender name="invalidRollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 현재 날짜의 파일은 아래 경로에 invalid.log로 저장 --> <file>/Users/occidere/Desktop/logs/invalid/invalid.log</file> <encoder> <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> <!-- 요일이 바뀌면서 과거 로그 파일 이름으로 변경. ex) invalid.log -> invalid.log.180817 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern>/Users/occidere/Desktop/logs/invalid/invalid.%d{yyyyMMdd}.%i.log</fileNamePattern> <!-- 10MB를 초과하면 새로운 번호를 붙여서 새로운 로그파일 생성. ex) invalid.log.180817.2.log --> <maxFileSize>10MB</maxFileSize> </rollingPolicy> </appender> <!-- 기본으로 적용되는 설정 --> <root level="debug"> <appender-ref ref="console"/> </root> <!-- 추후 java 코드에서 log.invalid 란 이름을 호출한다 --> <logger name="log.invalid" level="info" additivity="false"> <!-- 위의 <appender name='invalidRollingFileAppender .. > 를 호출한다 --> <appender-ref ref="invalidRollingFileAppender"/> <!-- 파일 로깅과 함께 콘솔 출력도 한다 --> <appender-ref ref="console"/> </logger> </configuration>



[테스트 코드 작성]

일반적으로 간단한 출력용 로그는 console output을 이용하고, Exception 이 발생했을 때, 해당 에러 내용을 기록해 놓기 위하여 FileAppender를 사용한다.

간단한 테스트 코드를 작성해보면 아래와 같다.


[src/main/java/Main.java]

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Main { /* 콘솔 출력용 로거. logback.xml의 root 설정값이 적용된다. */ public static final Logger consoleLogger = LoggerFactory.getLogger(Main.class); /* 파일 저장 및 콘솔 출력용 로거. logback.xml의 log.invalid 설정값이 적용된다. */ public static final Logger invalidFileLogger = LoggerFactory.getLogger("log.invalid"); public static void main(String[] args) { try { consoleLogger.info("Contents : {}", "Logger Test"); double d = 1 / 0; // 0으로 나누기 -> Exception 발생! } catch (Exception e) { invalidFileLogger.warn("INVALID : {}", e); } } }



[실행 결과]

위 코드를 실행한 결과는 아래와 같다.

consoleAppender로 찍은 로그 내용은 정상적으로 stdout으로 출력된 것을 볼 수 있고, Exception 발생 내용을 로깅한 것은 콘솔 출력 및 파일 저장까지 이뤄진 것을 확인할 수 있다.




[마무리 및 참고]

여기까지 해서 간단히 logback 사용법에 대해 알아보았다.
System.out 은 속도면에서 매우 느리므로 이를 이용한 출력은 지양하고, 반드시 logger를 사용하는 방향으로 개발을 진행하는 것이 좋다.