본문 바로가기
Spring/개념

Logging

by clearinging 2021. 12. 17.
반응형

apache slf4j 보안 이슈가 발생하면서 문제를 해결전 공부해보고 싶어서 글을 작성하게 되었습니다.

예제코드

Logging

정의

  • 서비스 동작 상태, 장애 정보를 제공하기 위해서 실행 이력을 남기는 행위를 의미

방식

  • linux의 Syslog
  • Logging lib 를사용(slf4j, logback ...etc)

slf4j(Simple Logging Facade For Java)

정의

  • Java Application에서 사용하는 Logging 기법

특징

  • 단독 사용 불가(하나의 Interface 라고 생각하기)
  • log 추상화 라이브러리

구성 요소

  • API(slf4j)
  • Binding
  • Bridge

slf4j 구성 요소

slf4j 전체 구성 요소

Bridge

  1. 정의
  • 레거시 logging을 사용하는 프로젝트를 위해 다른 Binding과 연동해주는 하나의 어댑터
  1. 특징
  • logger호출 하면 slf4j와 연결해 자동으로 slf4j의 인터페이스를 호출 하게 됩니다. 그리고 호출할 때 slf4j는 Binding을 호출 하기 때문에 레거시 로깅을 현재 사용하는 logging 라이브러리로 변경할 수 있습니다.
  • bridge를 여러개 생성 가능 합니다.
  • legacy 코드를 현대코드와 연결을 해준다는 점에서 slf4j에게 adapter로 작용합니다.
  • Bridge와 BInding을 같은 종류의 logging 구현체를 사용하면 안됩니다. -> 동일한 기능을 같이 사용하기 때문에 의미가 없기 때문입니다.

API

  1. 정의
  • logging을 위한 하나의 추상화된 interface
  1. 특징

  • logging을 위해 추상 layer를 제공합니다
  • api만 제공하기 때문에 혼자 사용할 수 없습니다
  • 혼자 사용할 수 없으므로 무조건 하나의 API에 하나의 Binding이 필요합니다.

Binding

  1. 정의
  • API의 실제 구현체
  1. 특징

  • slf4j와 logging 구현체와 연결하는 하나의 Adapter로 사용합니다.
  • 실제 구현체의 api를 호출가능 합니다.
  • Binding은 한개만 추가 가능합니다.

Spring Framework의 Logger

  • 기본 스프링에서는 logback을 default 로 설정합니다.
  • 만약 logback말고 다른 logging binding을 사용하고 싶을 경우 exclude를 통해 의존성을 제거하고, 새로운 로깅을 사용하면 됩니다.
  • 주로 spring boot에서는 lombok을 사용해서 slf4j logger factory로 logging 객체를 생성하는 것을 주고 사용하고 있습니다.

Loggin Level

  • Fatal
    • 심각한 이슈, 프로그램 자동종료가 예상 되는 이슈
    • 외부 API 에러일 경우 주로 사용합니다.
    • 예: 네트워크 socket 바인딩 이슈, oauth 외부 API 호출 에러
  • ERROR:
    • 프로그래머가 에러가 발생프로그램
    • 종료 하지 않음
    • 예시: null point exception 같은 케이스
  • WARN
    • 잠재적인 이슈를 의미
    • 크리티컬한 에러 전에 발견하기 위해서 사용 하는 것
    • 예시: in memeory DB 꽉차 가거나, DB connection 이 오래걸림
  • INFO
    • 명확한 의도를 가지고 있는 에러
    • 시스템 동작 과정을 보여줄 경우
    • 예시: user not found exception 케이스
  • Debug
    • Info level보다 더 자세한 정보를 필요할 경우 Dev환경에서 주로 사용
  • trace: 좀더 촘촘하게 디버깅할때 사용
    • 선능 이슈로 프로덕트에서 사용하면 안됩니다.

Logging message 작성법

  • 이해 관계자
    • 인간: 프로그래머
    • 기계: 로그를 파싱해서 사용하는 script: 메이플에서 로그 정보를 통해서 큐브 사용자에게 배상하게 되는데 이걸 기계가 한다고 생각하시면 됩니다.
  • format의 중요성
    • 기계가 읽기 쉽게 작성하는 것이 중요합니다.
    • [%d{yyyy-MM-dd HH:mm:ss}:%-2relative] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg%n
    • 설명
      • relative 옵션: 밀리초를 표시 앞에 숫자는 자리수를 의미
      • green : 색을 의미
      • thread: 기능이 동작하는 thread 명을 의미
      • %C : class 명
      • %M: method 명
      • %L: program line 수를 의미
  • 위와 같이 하나의 format을 잘 설정하면 parsing 하기 편리합니다. 그러므로 formatting을 잘성하는 것의 의미가 있습니다.
  • msg에서는 주로 인간이 읽는 데이터를 위치 시키는게 좋습니다.
    • 미래에 어떻게 대응할지
    • 어떤 이유로 에러가 날 것이라는것을 나타낼지
    • ... etc

Logback

구성 요소

  1. logback-core
  • 다른 2개의 모듈을 위한 기반역할을 담당합니다.
  • 파일과 console에 logging정보를 저장하는 기능을 담당하는 Appender와 Layout 인터페이스가 이 모듈에 속합니다
  1. logback-classic
  • logback-core를 가지고 있는 모듈입니다.
  • slf4j API를 구현한 모듈입니다
  • Logger class가 이모듈에 해당 됩니다.
  1. logback-access
  • servlet container와 통합되어 Http로 요청된 정보를 logging할 때 사용합니다.
  • application level이 아닌 container level 에서 설치되어 있습니다.
  • logback-core를 기반으로 구현된 데이터 입니다.

설정 요소

  1. Logger
  • 실제 Logging을 수행하는 구성 요소입니다.
  • 5가지의 level을 제공합니다
  • 기본 level을 설정해서 기본 level보다 낮은 logger level은 무시합니다.
  1. Appender
  • logback은 writer기능을 appender에게 위임을 합니다.
  • 어디에 작성할지 결정을 합니다.
    • ConsoleAppender: console에 출력
    • FileAppender: 하나의 단일 file에 등록
    • RollingFileAppender: file에 일정 조건에 맞게 따로 저장 합니다.
      • 예시: 10Mbyte단위로 파일에 저장한다. ... etc
  1. Layout
  • Appender에 포함된 요소 입니다.
  • 사용자가 지정한 format을 byte stream메시지로 변환 하고 outputStream을 통해서 저장하는 역할을 합니다.
반응형

'Spring > 개념' 카테고리의 다른 글

Spring Transactional 동작 과정  (0) 2022.04.10
AOP  (2) 2022.02.02
Servlet과 Spring Container  (1) 2021.12.04
Spring Test Mock 사용법 및 특징  (1) 2021.10.30
Spring Boot로 MySQL replication 연동하기  (0) 2021.10.06