[Java Library] slf4j + log4j2 한 방 정리

| slf4j와 log4j2


slf4j는 자바 로깅 시스템을 쉽게 사용할 수 있도록 해주는 라이브러리이며, 다양한 자바 로깅 시스템을 사용할 수 있도록 파사드 패턴(facade pattern) 및 추상화를 통해 로깅 기능을 제공합니다. 


slf4j를 사용함으로서 얻을 수 있는 이점은 기존에 사용하는 로깅 시스템을 교체하고 싶을 때, 소스 코드를 수정하지 않고도 maven이나 gradle의 의존성 설정만 바꾸면 손쉽게 적용할 수 있다는 점이죠. 


예로들어 logback을 로깅 시스템으로 사용한 자바 어플리케이션이 log4j로 로깅 시스템을 바꿀 일이 있으면 의존성 설정과 설정 파일만 조정해 주면 손쉽게 소스 수정없이 migration이 가능하단 점입니다.


log4j2는 자바 진영에서 제공하는 로깅 시스템이며 로깅과 관련된 여러 기능을 제공하는 유용한 라이브러리입니다. 


| slf4j와 log4j2를 연동


slf4j와 log4j2를 연동하기 위해서는 maven 기준으로 slf4j의 log4j2 구현체를 의존성에 추가하기만 하면 됩니다.


프로젝트 구조

+---src
| +---main
| | +---java
| | | +---log4j2
| | | | Log4j2.java
| | |
| | \---resources
| | log4j2.xml
+---pom.xml


의존성 관리

<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.10.0</version>
</dependency>
</dependencies>


소스 코드

package log4j2;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4j2 {

private static Logger LOGGER = LoggerFactory.getLogger(Log4j2.class);

public static void main(String[] args) {
LOGGER.info("a test message");
}
}
  • org.slf4j.Logger 클래스를 통해 log4j2 로깅 기능을 쓸 수 있습니다. 만약 log4j2를 사용하지 않고 logback과 같은 다른 로깅 시스템으로 바꾸고 싶다면 다음과 같이 pom.xml 설정을 바꾸기만 하면 됩니다.
<!--        <dependency>-->
<!-- <groupId>org.apache.logging.log4j</groupId>-->
<!-- <artifactId>log4j-slf4j-impl</artifactId>-->
<!-- <version>2.10.0</version>-->
<!-- </dependency>-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>


설정 파일


log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>

  • log4j2는 properties, json, yml, xml 등의 파일 확장자로 설정파일을 지정할 수 있습니다. 
  • log4j2가 설정파일을 찾는 메커니즘은 classpath를 기준으로 이루어집니다. xml 확장자를 기준으로 system property => log4j2-test.xml => log4j2.xml 순으로 설정 파일을 찾습니다. 만일 설정 파일을 찾지 못하면 default 설정이 적용됩니다. 이 밖의 자세한 내용은 공식 문서를 참조하시면 더 상세히 알 수 있습니다.
  • Configuration 태그 안에 log4j2의 설정 정보를 작성할 수 있습니다. Configuration 태그의 status는 log4j2 내부적으로 어떻게 동작되는 지(어떤 설정파일을 로딩했는 지, 어떤 패턴을 적용했는 지 등) 볼 수 있는 로그 수준을 결정하는 속성입니다. status를 INFO로 했을 경우에는 log4j2가 내부적으로 어떻게 동작하는 지 유의미한 로그를 보기 어렵지만 TRACE나 DEBUG로 놓았을 시에는 손쉽게 내부 로그를 볼 수 있습니다. 아래는 그 예시입니다.
2019-05-27 16:05:16,601 main DEBUG Initializing configuration XmlConfiguration[location=D:\JavaProject\target\classes\log4j2.xml]
2019-05-27 16:05:16,608 main DEBUG Installed 1 script engine
Warning: Nashorn engine is planned to be removed from a future JDK release
2019-05-27 16:05:16,858 main DEBUG Oracle Nashorn version: 11.0.1, language: ECMAScript, threading: Not Thread Safe, compile: true, names: [nashorn, Nashorn, js, JS, JavaScript, javascript, ECMAScript, ecmascript], factory class: jdk.nashorn.api.scripting.NashornScriptEngineFactory
2019-05-27 16:05:16,858 main DEBUG PluginManager 'Core' found 116 plugins
2019-05-27 16:05:16,859 main DEBUG PluginManager 'Level' found 0 plugins
2019-05-27 16:05:16,860 main DEBUG PluginManager 'Lookup' found 13 plugins
2019-05-27 16:05:16,862 main DEBUG Building Plugin[name=layout, class=org.apache.logging.log4j.core.layout.PatternLayout].
2019-05-27 16:05:16,869 main TRACE TypeConverterRegistry initializing.
2019-05-27 16:05:16,870 main DEBUG PluginManager 'TypeConverter' found 26 plugins
2019-05-27 16:05:16,879 main DEBUG PatternLayout$Builder(pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n", PatternSelector=null, Configuration(D:\JavaProject\target\classes\log4j2.xml), Replace=null, charset="null", alwaysWriteExceptions="null", disableAnsi="null", noConsoleNoAnsi="null", header="null", footer="null")
2019-05-27 16:05:16,879 main DEBUG PluginManager 'Converter' found 42 plugins

< Configuration status="TRACE" 로 놓았을 시 콘솔 로그 >


  • Appenders 태그는 로그를 어떻게 출력할 것인지를 결정하는 Appender들을 정의하는 태그입니다. 보통 파일, 콘솔 형태로 출력하고 더 나아가 DB에 직접 로그를 쓸 수도 있게 설정할 수 있습니다. 위의 예시로 봤을 때, <Console name="console" target="SYSTEM_OUT"> 에서는 콘솔로 로그를 출력하는 Appender를 지정한 것을 알 수 있습니다. 또한 PatternLayout 자식 태그에서는 어떤 식으로 로그 패턴을 출력할 지 지정할 수 있습니다.
  • Loggers 에서는 각 Logger 들에 대한 설정을 정의할 수 있습니다. 각 Logger들은 level, 경로, additivity 등의 속성을 지정하여 사용할 수 있습니다. Logger의 각 속성들은 아래에 자세히  다루겠습니다. Root는 logger 들의 최상위 부모 logger 로서 만일 하위 logger들에 대한 설정이 없다면 이 Root 로거의 설정 정보를 자동적으로 상속받아 쓰게 되어 있습니다. 또한 Logger의 하위 태그인 AppendRef를 지정하여 어떤 Appender를 쓸 지 지정할 수 있습니다. 


결과 화면

[INFO ] 2019-05-27 16:21:12.803 [main] Log4j2 - a test message



참고자료 : https://www.slf4j.org/

  https://logging.apache.org/log4j/2.x/index.html

이 글을 공유하기

댓글(0)

Designed by JB FACTORY