Spring Boot의 Logging

이동영·2024년 3월 12일
0

스프링

목록 보기
9/17

먼저 간단하게 Logging이 무엇인지에 대해서 설명하겠다. Logging은 시스템에서 발생하는 이벤트나 정보를 기록하는 과정이다. 이는 시스템의 문제를 해결하는 데 중요한 역활을 한다.

Logging의 주요 기능

  • 시스템 상태 추척 : 시스템의 작동 상태, 성능, 오류 등을 기록하여 시스템 관리에 활용한다.
  • 문제 해결 : 문제 발생 시 로그를 분석하여 원인을 파악하고 해결하는 데 도움을 준다.
  • 보안 강화 : 시스템에 대한 공격이나 침입을 감지하고 추적하는 데 사용할 수 있습니다.
  • 규정 준수 : 규정에 따라 시스템 활동을 기록하고 증명해야 하는 경우 로깅이 중요하다.

Spring Boot Logging 이해하기

Spring boot는 내부 로깅 즉 Spring boot 자체에 기본적으로 탑재된 로깅 기능을 의미한다. 즉 Spring Boot 애플리케이션을 개발할 때 별도의 로깅 라이브러리를 추가하지 않아도 기본적인 로깅 기능을 사용할 수 있으며 주로 Java Util Logging, Log4j2, Logback가 있다.

Spring Boot에는 프로젝트를 간편하게 설정해주는 Starters라는 기능이 있다. Starters를 사용하면 기본적으로 Logging은 Logback라이브러리에 의해 수행이 된다. 하지만 여러 라이브러리들이 서로 의존하는 경우가 있다. 이러한 의존 라이브러리들이 Java Util Logging, Commons Logging, Log4J, 또는 SLF4J를 사용한다고 해도 Spring Boot는 적절한 Logback 라우팅을 통해 모두 문제 없이 동작하도록 설정이 되어 있다.

스프링 부트의 Starters가 기본적으로 logback을 지원해주며 라우팅 기술을 통하여 log4j2와 같은 라이브러리를 사용하더라도 스프링 부트는 결국 logback으로 전달되기때문에 로그설정은 기본적인 logback설정만 하면 되는것이다.

Spring Boot 내부 로깅의 주요 특징

  • Commons Logging 추상화 계층 사용 : Spring Boot내부적으로 Commons Logging이라는 추상화 계층을 사용하여 로깅 기능을 제공한다.
  • 로깅 추상화 계층 : 다양한 로깅 라이브러리를 하나의 추상적인 인터페이스로 묶어 제공하는 개념이다. 이를 통하여 개발자는 구체적인 로깅 라이브러리에 대해 알지 못하더라도 추상적인 인터페이스를 통하여 원하는 로깅 라이브러리를 선택하고 사용할 수 있다.
  • 다양한 로깅 라이브러리(예: Log4j, Logback, JUL)등등이 있지만, 로깅 추상화 계층 (예: Commons Logging)은 이들을 하나의 추상화된 인터페이스로 묶어 제공한다.

예시

  • Spring Boot는 마치 자동차의 제조사와 같다.

추상화 계층

  • 여러 구체적인 구현을 하나의 추상적인 인테페이스에 묶어 제공하는 개념이다. 이를 통하여 사용자는 구체적인 구체적인 세부 개념을 모르더라도 추상적인 인터페이스를 통하여 기능을 사용할 수 있다.
  • 자동차 : 여러 구체적인 모델(소나타, 테스라, 벤츠)로 구성이 된다. 하지만 운전자는 각 모델의 세부적인 구현을 알 지 못하더라도 운전이라는 추상적인 인터페이스를 통해 자동차를 운행할 수 있다.

라우팅

교통체계처럼 각 로깅 메시지 목적지(Logback)에 도달하도록 하는 경로하는 경로 설정을 의미한다. spring boot는 이러한 라우팅 기능을 통하여 서로 다른 로깅 라이브러리를 사용하는 의존 라이브러리에서 발생하는 로그 메시지도 logBack으로 잘 전달되도록 보장한다.

스프링 부트를 사용하면 별도 설정 없이 logback을 기본 로깅 라이브러리로 사용하면서, 다른 로깅 라이브러리를 사용하는 의존 라이브러리와도 호환되는 효과적인 로깅 환경을 구축할 수 있다.

로깅 메시지를 우편물로 생각하기

  • spring boot는 모든 우편물을 LogBack이라는 우체국으로 보내도록 설정되어 있다.
  • 하지만 의존 라이브러리들은 Java Util Logging, Commons Logging, Log4J, 또는 SLF4J와 같은 다른 우체국을 사용할 수 있다.
  • spring Boot는 라우팅이라는 기능을 통해 이러한 다른 우체국으로 보내진 우편물도 LogBack우체국으로 잘 전달되도록 한다.
  • 마치 다른 우체국에서 보내진 우편물이 모두 중앙 우체국에 모여 처리되는것과 같다.

정리 :스프링부트는 기본적으로 Logback을 사용하지만 다른 Log4j, Logback, JUL도 사용할 수 있도록 환경을 구축할 수 있으며 다른 의존 라이브러리도 결국 Logback에 도달된다는 것이다.

웹 어플리케이션 배포시의 로깅

서블릿 컨테이너 또는 어플리케이션 서버에 애플리케이션을 배포할 때 Java Util Logging(JUL)API를 사용하여 수행된 로딩은 애플리케이션 자체의 로그로 라우팅이 되지 않는다.
이는 컨테이너 자체나 다른배포된 애플리케이션에서 수행된 로깅이 사용자의 애플리케이션 로그에 포함되지 않도록 하는것이다.

  • 컴퓨터 프로그램은 서버라는 장치에서 실행이 된다.
  • 서버에는 여러 애플리케이션을 동시에 실행할 수 있는 프로그램(서블릿 컨테이너 어플리케이션 서버)가 설치되어 있다.
  • 사용자의 어플리케이션은 이 서버 위해서 실행이 된다.
  • Java Util Logging(JUL)API는 로깅 메시지를 기록하는 표준 방법이다.
  • JUL API를 사용하여 서버프로그램이나 다른 배포된 애플리케이션에서 로깅을 수행하면, 사용자의 애플리케이션에서는 해당 로그를 볼 수 없다.
  • 이는 서로 다른 로깅 애플리케이션의 메세지가 섞여 정보를 확인하기 어렵다.

따라서 서버에 애플리케이션을 배포할 때 JUL API이외에도 다른 로깅 기능을 설정하거나 서버 프로그램의 자체 로깅 설정을 별도로 진행해야 한다.
서버 로깅 : 톰캣 자체로그

[2023-11-14 15:27:53.786] [INFO] [main] org.apache.catalina.startup.Catalina - Server startup in 2504 ms
[2023-11-14 15:27:54.123] [INFO] [localhost-startStop-1] org.apache.catalina.core.StandardEngine - Starting service Catalina
[2023-11-14 15:27:54.133] [INFO] [localhost-startStop-1] org.apache.catalina.core.StandardService - Starting service Catalina
[2023-11-14 15:27:54.141] [INFO] [localhost-startStop-1] org.apache.catalina.core.ApplicationContext - Initializing Spring embedded WebApplicationContext
[2023-11-14 15:27:54.445] [INFO] [localhost-startStop-1] org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 312 ms

사용자 로깅 : spring boot로그

[2023-11-14 15:27:54.789] [INFO] [main] com.example.demo.Application - Started DemoApplication in 2.5 seconds
[2023-11-14 15:27:55.012] [INFO] [main] com.example.demo.controller.HomeController - GET /
[2023-11-14 15:27:55.013] [INFO] [main] com.example.demo.controller.HomeController - Welcome to the home page!
  • spring boot로그만 볼 수 있으며 서버(톰캣)로그를 볼 수 없다.
  • JUL API는 서버 프로그램 자체 로깅과 사용자 애플리케이션 로깅을 구분하지 않는다.
  • JUL API만 사용하게 되면 프로그램 자체 로깅과 사용자 애플리케이션 로깅이 섞여 정보를 확인하기 어렵다.
  • 이 둘을 구분하기 위해 서버 프로그램 자체 로깅 설정을 별도로 확인해야 한다.
profile
가치를 제공하는 개발자

0개의 댓글