본문 바로가기
Java

[Java] 디버깅을 위한 로깅(logging)

by bkuk 2023. 3. 10.

System.out.println은 앞으로 사용하지 말자.

개발자는 애플리케이션이 정상적으로 동작하는지 확인하기 위한 목적, 애플리케이션에 문제가 발생했을 때 원인을 파악하기 위한 디버깅을 목적으로 수많은 메시지를 출력한다. 원인을 파악하기 위한 디버깅을 목적으로 수많은 메시지를 출력한다. 이때 사용하는 것이 System.out.println() 이다.

하지만, 이를 디버깅 메시지로 출력하면 파일로 메시지가 출력하게 되는데 파일에 메시지를 출력하는 작업은 상당한 비용이 발생하는 작업이다. 또한, 소스코드에 포함되어 있는 경우 구현한 코드는 삭제하거나 주석 처리하는 방법으로 해결하는 경우가 있다. 이 또한 모두 비용이며, 디버깅을 목적으로 메시지를 출력하고 싶으면 또 다시 원복해야 하는 문제점이 있다.

이와 같은 단점을 보완하기 위해 등장한 라이브러리가 로깅(loggin) 라이브러리이다.

자바에서 많이 사용하는 로깅 라이브러리는 Logback이다.

 

아래 로깅 라이브러리를 사용한 코드이다.

/* 생략 */
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class RequestHandler extends Thread {
    private static final Logger log = LoggerFactory.getLogger(RequestHandler.class);

    private Socket connection;
    
    public RequestHandler(Socket connectionSocket) {
        this.connection = connectionSocket;
    }

    public void run() {
        log.debug("New Client Connect! Connected IP : {}, Port : {}", connection.getInetAddress(),
                connection.getPort());
/* 생략 */

 

LogBack 라이브러리에 대한 구현체는 메이븐 설정 파일인 pom.xml에 다음과 같이 설정하고 있다.

/* 생략 */
<!-- logger -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.2</version>
</dependency>

 


메시지 출력 여부를 로그 레벨로 관리하자.

 

대표적인 로그 레벨은 TRACE, DEBUG, INFO, WARN, ERROR 가 있으며,

로그 레벨은 TRACE < DEBUG < INFO < WARN < ERROR 순으로 높아진다. 예를 들어 WARN 로그 레벨로 설정하면 WARN, ERROR 레벌의 메서지만 출력되고, DEBUG 로그 레벨로 설정하면 DEBUG, INFO, WARN, ERROR 레벨의 메세지가 출력된다.

또한, 동적인 메세지를 출력하려면 아래와 같이 구현하면 된다.

// log.debug() 메서드

log.debug( "New Client Connect! Connected IP: {}, Port: {}"
		, connection.getInetAddress(), connection.getPort());

 

로그 레벨과 메시지 형식은 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
	<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>%d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n</Pattern>
		</layout>
	</appender>
	
	<root level="DEBUG">
		<appender-ref ref="STDOUT" />
	</root>
</configuration>

 

로그 메시지의 패턴 변경이 가능하다. 위에서 설정한 내용으로는 로그 메시지가 출력되는 시간, 쓰레드 이름, 로그 메시지가 출력되는 소스코드의 위치 등이다.

또한, 위 설정의 로그 레벨은 DEBUG 이다. 보통 개발 단계에서는 DEBUG와 같이 낮은 로그 레벨로 설정하다 실 서비스로 배포할 때 INFO나 WARN과 같은 로그 레벨로 설정함으로써 개발 단계에서 디버깅을 위해 출력하는 로그를 출력하지 않도록 설정한다.

댓글