로그출력은 항상 기본으로 세팅되어있어서 업무 하면서 신경 쓰지 않았으나 이전 log4j관련해서 이슈가 있어 지금 우리 회사는 로그관리를 위해 어떤 것을 사용하고 있나 알아보았었고 logback을 사용하고 있었다. 그때는 그렇구나 하고 넘어갔었는데 이번에 직장동료의 console창에 로그가 출력되지 않는 것을 도와주면서 이번 기회에 로그관리에 대해서 제대로 공부해보자 라는 생각이 들어 정리해보려고 한다.
이 글을 보고 계신 프로그래머 선배님들이나 미래의 내가 정리한 내용이 잘못되거나 수정이 필요하다고 느낀다면 언제든지 댓글로 알려주면 좋겠다.
Logback이 무엇인가?
Logback은 Logging Framework이다. 쉽게 말하면 개발자가 로그(기록)를 분석할 수 있게 해주는 라이브러리다.
Spring Boot의 기본 Logging Framework이기도 하여, Spring Boot기반 프로젝트는 기본으로 설정되어 있어 별도록 라이브러리를 추가해주지 않아도 되며, 대부분 Logback을 사용한다고 생각하면 된다. 홈페이지를 들어가 보면 Java에서 많이 사용되었던 log4j의 후속제품이라고 써져 있다. 또한 log4j의 설립자인 Ceki Gülcü가 설계했기 때문에 log4j랑 비슷한 점이 많으며, 제공하는 기능들이 많아서 로그파일을 쉽고 빠르게 작성할 수 있다.
Logback 구조
Logback은 아래 세 가지 모듈로 나뉜다.
- logback-core
- logback-classic
- logback-access
logback-core
는 다른 두 모듈의 토대를 마련한다. 이후 설명하겠지만 Appender
와 Layout
인터페이스가 이 모듈에 속한다.
logback-classic
은 위 언급한것 처럼 logback-core
의 확장 모듈로 logback-core
와 SLF4J API
를 가진다.
이후에 설명할 Logger
클래스가 이 모듈에 속해있다.
logback-access
는 Tomcat
및 Jetty
와 같은 Servlet Container와 통합되어 HTTP 액세스 로그 기능을 제공한다. 따라서 웹 애플리케이션 레벨에서가 아닌 컨테이너 레벨에서 설치되어야 한다.
Logback 사용해보기
logback 라이브러리를 추가해 보자. 흔히 사용하는 Eclipse와 Maven을 이용해볼 예정이다. 혹시 Eclipse에서 Maven project를 만드는 법을 모른다면.... 아래 링크를 참고하길 바란다.
Maven project를 생성했다면 pom.xml의 아래 <dependency>를 추가해보자.
1.2.9 버전을 사용했으나, 다른 버전을 사용하고 싶다면 아래 링크에서 dependency를 추가하는 양식을 참고해도 좋다.
https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.9</version>
</dependency>
아래와 같이 프로젝트 폴더의 Maven Dependencies에 라이브러리들이 잘 들어갔는지 확인할 수 있다.
아래와 같이 main메서드를 가진 java파일을 생성하고 코드를 작성해 보자.
package com.backhero;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackTest
{
public static void main( String[] args )
{
Logger logger = LoggerFactory.getLogger("com.backhero.LogbackTest");
logger.debug("My name is HERO");
}
}
logging하기 위해서는 Logger객체를 사용해야 하는데 static메서드인 LoggerFactory.getLogger() 메서드를 통해 Logger 인스턴스를 가져오는 것을 알 수 있다. "com.backhero.LogbackTest"의 경우 생성해줄 Logger의 이름을 뜻 한다.
기본적으로 Logger명은 패키지 경로를 포함한 클래스명 또는 객체.class를 전달하여 생성해 줘야 한다.
객체.class를 매개변수로 사용하면 packageName + ClassName로 구성된다. 쉽게 설명하자면 아래와 같이 정의해주면 된다.
Logger logger = LoggerFactory.getLogger("com.backhero.LogbackTest"); 또는
Logger logger = LoggerFactory.getLogger(LogbackTest.class);
이제 java파일을 실행해보자 실행하게 되면 Console창에 다음과 같이 출력된다.
01:36:22.722 [main] DEBUG com.backhero.LogbackTest - My name is HERO
logback 설정을 따로 하지 않았기 때문에 기본 설정을 참고하게 되는데, 콘솔로 로그를 출력하는 ConsoleAppender를 사용하며, 출력 패턴은 아래와 같은 포맷을 사용한다. 지금은 그렇구나 하고 넘어가도 좋다.
[ 시간 / 호출 메서드 / 로그 레벨 / 클래스명 / 로그 내용 ]
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
이제는 Logger의 상태 데이터에 대하여 출력하는 법을 알아보자 Logback의 내장 상태 시스템(built-in status system)을 이용하면 내부 시스템에 대한 정보를 출력할 수 있다. Logback에서 일어나는 주요 이벤트들은 StatusManager를 통해 접근할 수 있아래와 같이 코드를 수정 후 실행해 보자.
package com.backhero;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
public class LogbackTest
{
public static void main( String[] args )
{
Logger logger = LoggerFactory.getLogger("com.backhero.LogbackTest");
logger.debug("My name is HERO");
// built-in status system 출력
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
}
}
[실행결과]
01:38:32.632 [main] DEBUG com.backhero.LogbackTest - My name is HERO
01:38:32,555 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
01:38:32,555 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
01:38:32,556 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
01:38:32,563 |-INFO in ch.qos.logback.classic.BasicConfigurator@394e1a0f - Setting up default configuration.
Logback이 순서대로 설정정보를 가지고 있는 classpath 경로상의 logback-test.xml, logback.groovy, logback.xml 파일이 있는지 검사하여 존재하는 경우 우선순위에 따라 설정파일로 사용한다. 그러나 우리는 아직 설정한 것이 없기 때문에 해당 파일들을 찾을 수 없다는 로그를 확인할 수 있고, Logback은 위에서 언급한 것처럼 기본 설정 정책을 통해 ConsoleAppender를 이용하게 된다.
해당 포스팅을 통해 대략적으로 logback이 무엇인지 이해했기를 바란다. 다음 포스팅으로는 logback구조에 대해 정리해보려고 한다.
여담으로 정리하면서 알게 된 사실인데 처음에 언급했었던 log4j보안 취약점 이슈로 인해 logback의 버전이 1.2.9 이하면 조치 대상이라고 한다. 아래 링크에서 확인할 수 있다.
https://mvnrepository.com/artifact/ch.qos.logback/logback-core
참고 1. https://logback.qos.ch/manual/introduction.html
'Logback' 카테고리의 다른 글
Logback- 2. Logback의 구조 [Architecture] (0) | 2023.02.26 |
---|