DevBoi

[Springboot] logging 전략 관련 주저리... 본문

Develop/[Spring]

[Springboot] logging 전략 관련 주저리...

HiSmith 2022. 5. 9. 23:16
반응형

log4j -> logback

성능이 더 좋고, 메모리도 적게 사용한다. 

Spring profile을 사용할 수 있다.

springboot starter-web에 포함

log4j -> logback -> log4j2 로 진화했다.

 

@SLF4J는 

프레임워크 대부분에서 어떤 방식으로든 구현되는 표준화된 API를 제공한다.

이 API를 통해 코드 안바꾸고, 로깅 프레임워크를 변경할 수 있다.

sysout은? PrintStream 클래스의 println()의 내부구조에 동기화처리, 쓰레드당 한개만 쓸수 있다.

그래서 쓰레드하나가 쓰고있으면, 다른 쓰레드에서 Block이 걸리게된다.

-정리-

log4j와 같은 다양한 로깅 프레임워크에 대한 추상화 역할을 하는 라이브러리이다.

컴파일 시 하나의 로깅 프레임워크와 바인딩 해준다.

따라서 로그 라이브러리를 교체해도, 어플리케이션 코드는 변경될 필요가 없게 해준다.

 

 

 

Logback , log4J의 차이

* log4j의 후속버전

* logback-classic은 SLF4J를 구현했다. logback-classic의 Logger클래스는 slf4j의 API스펙을 구현하므로, slf4j의 API를 

그대로 사용하여도 되는 이점이 있다.(이 api를 그대로 따르게 되면, 로깅 프레임워크에 대한 변경을 편하게 할 수 있다.)

* 파일들에, 로그파일을 저장하는데, 해당 파일에 대한 IO작업이 실패하는 경우, logback을 위해 어플리케이션을 재기동 할 필요가 없다.

(FileAppender및 RollingFIleAppender의 하위 클래스들은 I/O 오류를 자동 복구할 수 있다.)

* log4j는 로그 레벨을 변경하면, 서버를 재기동하여 반영 사항을 적용해줘야한다. 만약 logback.xml을 서버를 재기동 할 필요없이 바로 리로드를 지원해준다.

* logback은 특정 사용자에서의 로그레벨을 변경하는 등의 필터정책을 사용가능

(regular filter, turbo filter 제공

regular filter는 filter를 상속하고, decide메서드를 구현, 등록된 filter는 차례대로 decide메서드를 호출하여

fitlerReply를 반환한다. (enum_deny,neutral,accept)

deny가 반환되면, 로그 이벤트는 drop되며, 나머지 필터들에 대해 검증하지않는다.(다음 decide를 호출 x)

accept는 decide하지않고 바로 동작

 

 

)

* Groovy코드를 통한 설정을 지원, Xml에서 사용하는 설정이 Groovy로 바뀌었을때 어떤식으로 사용되는지도 

문서로 지원한다.

 

 

 

 

log4j2, logback의 차이

가장 최신에 나온 로깅 프레임워크, logback처럼 필터링 기능과 자동 리로딩 기능을 지원한다.


* 멀티쓰레드 환경에서 비동기 로거의 경우, 다른 로깅 프레임워크보다 처리량이 훨씬 많고, 대기시간이 훨씬 짧다.

* 람다식 지원

* Lazy Evalutation지원 - 진정으로 필요한 경우에만, 평가되는 람다 문 안에 로그메시지를 래핑하는 API를 제공한다.

(람다식을 지원하기에, 자동으로 따라오는 성능이라고 보면된다.)

* 가비지 관련 : 로깅중에 로그 이벤트 개체, 문자열, 문자 배열, 바이트 배열등과 같은 임시 개체를 할당한다.

이는 GC에 부담을 주고, GC일시중지가 발생하는 빈도를 증가 시킨다.

 

logback과 가장 큰 차이는 멀티쓰레드 환경에서 비동기 로거와 관련한 경우이다.

 

--------------------------------------------------------------------------------------------------------------

나는 로깅 관련 프레임 워크 담당했음 (log4j -> log4j2 -> logback)

1) logback

logback 이란?

오픈소스 로깅 프레임워크, SLF4J의 구현체

스프링 부트 기본으로 설정, 별도 라이브러리 추가하지 않아도된다.

log4j보다 휼륭한 성능

spring boot starter-web안에 springboot-starter-logging에 구현체가 있다.

Logback을 이용하여 로깅 수행할때, 주요 요소는

Logger, Appender, Encode 가 있다.

 

1)classpath에 logback-spirng.xml파일 내 설정을 읽어간다.

2)파일 없으면 properties파일의 설정을 읽어간다.

3)둘다 있으면 properties설정 파일을 적용하고, xml파일이 적용된다.

 

properties에 따라 profile, 즉 배포환경에 따라 값 을 읽어올수 있다.

로깅 레벨을 패키지 별로, 각각 다르게 설정할 수도있다.(controller, dao등등)

 

기본 특징

-대소문자 구분 x

-logback-spring.xml 은 appender와 logger 크게두개로 구분된다.

-dynamic reloading 기능 지원(60초마다, logback-spring.xml 이 바뀌었는지 검사하고 바뀌었으면 프로그램을 갱신할 수있도록 할 수 있다.)

 

1)appender (File Appender 설정)

log의 형태를 설정, 로그메시지가 출력될 대상을 결정하는 요소 (콘솔? 파일?)

 

2) root,logger

설정한 appender를 참조하여 package와 level설정한다.

root는 전역 설정이구, 지역적으로 선언된 logger 설정이 있다면, 적용된다.

 

 

4) encoder

encoder : appender에 포함되어 사용자가 지정한 형식으로 표현될 로그메시지를 변환하는 역할을 담당하는 요소(포맷 맞추기)

 

참고, JDBC상에서 찍히는 로그를 보려면 추가로 설정해야한다.

설정을 하게 되면, sqlnonly, preparement sql, resultset 등등을 로그로 찍어준다.

 

이름은 log4jdbc이고, 추가로 설정을 해줘야한다는 것만 알아두자

 

 

다만 log4j2는 

해당 공격자의 서버에서 원격으로 코드를 실행할 수 있는 취약점이 발견되었다.

 

 

log4j2는 logback 이후에 나온 만큼 logback과 마찬가지로 필터링 기능과 자동 리로드 기능을 가지고 있다.

multi thread 환경에서 비동기 로거의 경우, 다른 프레임워크보다 처리량이 높고, 대기 시간이 짧다.

Spring boot 기본은 logback이기 때문에 exclude 작업을 진해아고, log4j2를 주입한다.

 

log4j2.xml파일에서

%d, %c, %C, %m 등등을 입맛에 맞게끔 커스텀해서 사용할 수 있다.

 

그러면 log4j2의 장점에 대해서 알아보자

garbage생성이 낮아 gc발생 확률을 줄이기 때문에 성능이 좋다.

왜?

 

logbacK,log4j는 arrayblockingqueue를 사용하는데,

이 que는 멀티쓰레드에서, log event 큐에 넣으려고할떄 잠금 경합이 발생한다.

왜?

arrayblockingqueue라는 것을 알아야한다.

큐이긴 큐인데, add or remove시에 조건에 맞지않으면, 맞을때까지 대기할 수 있게끔 한 클래스이다.

배열의 크기가 정해져있을때 사용을 한다.

만약에 배열이 꽉차면, 넣기전에 자리가 날때까지, 즉 뭔가가 제거될 떄 까지 기다린다.

 

 

log4j2는  비동기 logger, 잠금이 없는 데이터 구조 LMAXDisruptor를 사용한다.

쓰레드의 개수가 늘어날 수록 성능 차이가 더 보인다.

LMAX Distrupter는 큐 (Ringbuffer) 모델 기반으로 병렬처리 패러다임을 가지고있다.

 

 

 

------------------------------------------------------------------------------------------

appender

-log 형태 및 출력을 어디에서 할지 결정하는 요소 (파일, 콘솔,롤링파일 어팬더)

 encoder

-log 형태를 결정한다. 어떤 포맷으로 출력할지...

root

-전역 레벨 설정, 지역으로 바꿀려면 logger를 사용해서 로그 레벨을 설정한다.

 

 

 



 

 

-스프링 프로파일링을 사용해서, 환경별 다른 로그 레벨 설정

기존에는 다 똑같이 info레벨에 대한 로그만 필터링, 로그 쓰는 것

 

-로그 압축기능을 사용해서, 서버 저장 용량 효율적 사용(sizeBasedTriggeringPolicy)

-로깅 전략을 신규로 세움(7일 보관, 지난 파일 S3보관)

-로그 파일 분리(info, error)

(appender를 통해 일반 로그와, error로그 파일 분리)

-로그 포맷을 encoder로 통일하게 맞춤

 

 

 

처음에는 log4j -> logback

* 로그파일 쓰기 오류시 자동복구

* 재기동하지 않고 로그레벨 변경이가능

* 함수형 로그 작성 가능(지연 계산 지원) 하다고 해서 도입 결정

* 추가로 속도와 메모리 점유도 적게된다고해서 결정

* 스프링 부트 기본 로깅 프레임워크

 

위 3가지랑,

* 로그 파일 분리(log,error)_appender -> 일별로, error로그 파일에 대한 리뷰 진행

* 로그 포맷 통일(encoder)

* log4j -> slf4j + logback으로 전환 (추후 로깅 프레임워크 변경하더라도, 소스파일은 변경하지 않아도된다.Log -> Logger)

* Exception 발생시 참조했던 외부 라이브러리 버전 출력 -> java는 라이브러리에 의한 Exception은 출력을 안함* logback은 로그 레벨 변경시 내부 스캐닝하는 별도 쓰레드가 있어, 서버를 재기동 할 필요가 없다.(설정 파일의 Dynamic Reloading 지원, log4j도 가능은 하지만 외부 라이브러리를 사용해야하는 걸로 알고있음)* log4j에 비해 성능은 10배 정도 개선하고, 메모리 점유도 적게 사용한다고 한다, 또한 많은 테스트를 진행하였다고 공식 발표---

* Filters 생성-> custom Exception으로 발생되는 혹은 오류를 일으키는 로그들을 분류, appender 사용 (상품/주문)

-> EvaluatorFIlter를 사용, Accept를 사용해서 별도 파일로 분리하였다.

* SiftingAppender -> 

----

 

 

----

 

logback - access, classic,core로그백은 레귤러 필터, 터보 필터 두가지가 있다.레귤러 필터는 decide방식을 실현,

 

 

 

 

logback으로 하면 뭐가 좋음?

로그파일 쓰기 오류시 자동복구, 로그 레벨 변경,

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Develop > [Spring]' 카테고리의 다른 글

[Spring] SessionLocaleResovler  (0) 2022.05.11
[Spring] HandlerInterceptor  (0) 2022.05.10
[Spring] HandlerInterceptor  (0) 2022.05.03
[Spring] ControllerAdvice  (0) 2022.05.02
@SessionAttribute에 대해서  (0) 2022.04.29