반응형
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 구성 요소
Bridge
- 정의
- 레거시 logging을 사용하는 프로젝트를 위해 다른 Binding과 연동해주는 하나의 어댑터
- 특징
- logger호출 하면 slf4j와 연결해 자동으로 slf4j의 인터페이스를 호출 하게 됩니다. 그리고 호출할 때 slf4j는 Binding을 호출 하기 때문에 레거시 로깅을 현재 사용하는 logging 라이브러리로 변경할 수 있습니다.
- bridge를 여러개 생성 가능 합니다.
- legacy 코드를 현대코드와 연결을 해준다는 점에서 slf4j에게 adapter로 작용합니다.
- Bridge와 BInding을 같은 종류의 logging 구현체를 사용하면 안됩니다. -> 동일한 기능을 같이 사용하기 때문에 의미가 없기 때문입니다.
API
- 정의
- logging을 위한 하나의 추상화된 interface
- 특징
- logging을 위해 추상 layer를 제공합니다
- api만 제공하기 때문에 혼자 사용할 수 없습니다
- 혼자 사용할 수 없으므로 무조건 하나의 API에 하나의 Binding이 필요합니다.
Binding
- 정의
- API의 실제 구현체
- 특징
- 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
구성 요소
- logback-core
- 다른 2개의 모듈을 위한 기반역할을 담당합니다.
- 파일과 console에 logging정보를 저장하는 기능을 담당하는 Appender와 Layout 인터페이스가 이 모듈에 속합니다
- logback-classic
- logback-core를 가지고 있는 모듈입니다.
- slf4j API를 구현한 모듈입니다
- Logger class가 이모듈에 해당 됩니다.
- logback-access
- servlet container와 통합되어 Http로 요청된 정보를 logging할 때 사용합니다.
- application level이 아닌 container level 에서 설치되어 있습니다.
- logback-core를 기반으로 구현된 데이터 입니다.
설정 요소
- Logger
- 실제 Logging을 수행하는 구성 요소입니다.
- 5가지의 level을 제공합니다
- 기본 level을 설정해서 기본 level보다 낮은 logger level은 무시합니다.
- Appender
- logback은 writer기능을 appender에게 위임을 합니다.
- 어디에 작성할지 결정을 합니다.
- ConsoleAppender: console에 출력
- FileAppender: 하나의 단일 file에 등록
- RollingFileAppender: file에 일정 조건에 맞게 따로 저장 합니다.
- 예시: 10Mbyte단위로 파일에 저장한다. ... etc
- 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 |