logging framework개념(slf4j과 logback)

서형준·2021년 5월 19일
0

logging이란?

  • 정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동
  • 프린트 줄 넣기(printlining)는 간단한, 보통은 일시적인, 로그를 생성하기만 한다.
  • 시스템 설계자들은 시스템의 복잡성 때문에 로그를 이해하고 사용해야 한다.
  • 로그가 제공하는 정보의 양은, 이상적으로는 프로그램이 실행되는 중에도, 설정 가능해야 한다.
  • 일반적으로 로그 기록의 이점
    - 로그는 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있다.
    - 로그는 성능에 관한 통계와 정보를 제공할 수 있다.
    - 설정이 가능할 때, 로그는 예기치 못한 특정 문제들을 디버그하기 위해, 그 문제들을 처리하도록 코드를 수정하여 다시 적용하지 않아도, 일반적인 정보를 갈무리할 수 있게 한다.

logging framework의 필요성

평소 디버깅을 할 때마다 System.out.println을 사용해 디버깅을 위한 메세지를 출력하는데 이는 프로그램의 성능을 떨어트립니다. 따라서 개발중 추가한 디버깅 메세지를 실 서비스하는 시점에 제거해야 합니다. 자바 웹 프로그래밍 저자이신 '박재성'님은 절때로 System.out.println을 사용하지말고 Logback을 이용하라고 할 정도로 중요합니다.

로그 라이브러리 종류

-java.util.logging
-JDK 1.4부터 포함된 표준 로깅 API
-별도 라이브러리 추가 불필요
-기능이 많이 부족해 다른 로그 라이브러리를 더 많이 사용
-Apache Commons logging
-아파치 재단에 Commons 라이브러리 중에 로그 출력을 제공하는 라이 브러리
-Log4j
아파치 제단에서 제공하며 가장 많이 사용되는 로깅 라이브러리
-Logback
Log4j를 개발한 Ceki Gulcu가 Log4j의 단점 개선 및 기능을 추가하 여 개발한 로깅 라이브러리

slf4j란

logging 관련 라이브러리는 다양하다.
이러한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법을 SLF4J는 제공한다.
SLF4J는 로깅 Facade이다.
로깅에 대한 추상 레이어를 제공하는 것이고 interface의 모음이다.

즉 새로운 로깅 라이브러리가 나와도 slg4j api를 이용해서 같은 방법으로 사용하기 떄문에 application 코드를 수정하지 않아도 사용가능합니다.

logback과 slf4j 추가하기

		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.25</version>
		</dependency>

maven에 SLF4J와 logback의존성 추가합니다.

참고로 logback-classic 1.2.3은 이미 slf4j-api 1.7.25에 대한 의존성을 가지고 있기 때문에 slf-j-api를 추가할 필요는 없다.
Spring은 기본적으로 commons-logging을 사용합니다. 그래서 logback라이브러리를 사용하려면 제거를 해야합니다. Spring라이브러리에서 commons-logging을 제거하면, Spring을 사용할 때 commons-logging라이브러리를 찾으면서 오류가 발생합니다.
이러한 오류를 제거하기 위해서 jcl-over-slf4j를 추가해야 합니다.
그후에 logback 설정을 통해서 Appender, logger, root 설정을 합니다.

Log Level
trace : debug보다 세분화된 정보
debug : 디버깅하는데 유용한 세분화된 정보
info : 진행상황 같은 일반 정보
warn : 오류는 아니지만 잠재적인 오류 원인이 될 수 있는 경고성 정보
error : 요청을 처리하는 중 문제가 발생한 오류 정보

다 설정했으면 로그를 남기고자 하는 클래스에 객체를 필드로 선언합니다.

private Logger logger = LoggerFactory.getLogger(this.getClass());

이제 System.out.println이아닌 로깅 라이브러리를 사용하는 습관을 들여야 합니다.

profile
실력있는 Back-End 개발자를 꿈꾸는 서형준입니다.

0개의 댓글