티스토리 뷰
진행하고 있는 프로젝트에서 logging library로 log4j2를 사용하고 있다
후보로는 log4j, logback, log4j2 등이 있었는데 performance 결과를 비교한 것을 보고 바로 정할 수 있었다
log4j2는 비동기 방식으로 처리되기 때문에 다른 slf4j 구현체들을 압살 하는 성능을 가지고 있다
성능이 미친듯이 뛰어나기 때문에 오류 또한 logback에 비해 훨씬 덜 나는 건 보너스다
스프링 부트를 사용하는 경우, 설정 또한 크게 어렵지 않기 때문에 학습 & 성능 향상 목적으로 도입했다
JPA를 사용할 때 application.yml 설정에 아래와 같은 설정을 추가해주면 log4j2를 이용해 이쁘장한 형태로 쿼리가 나온다
spring:
jpa:
open-in-view: false
generate-ddl: true
properties:
hibernate:
format_sql: true
default_batch_fetch_size: 100
logging:
level:
org:
hibernate:
SQL: debug
type:
descriptor:
sql:
BasicBinder: trace
위의 설정을 적용한 결과다 형태가 잡힌 쿼리문도 나가고 물음표로 치환된 parameter에 들어가는 값도 바인딩이 된다
하지만 보다시피 변수가 많아질수록 한눈에 파악하기 쉽지 않다
사실 아래 결과도 하나의 쿼리문에 변수도 13개밖에 되지 않고 내가 작성한 코드기 때문에 쉽게 이해할 수 있는데
이런 쿼리, 변수를 남이 본다면 ..?
쿼리문 물음표들에 변수들이 직접 바인딩된다면 얼마나 좋을까?
개발의 세계는 발 빠르다, 역시나 이미 만들어져 있다
p6spy라는 Library를 사용하면 원하는 결과를 얻을 수 있다
여기까지만 하더라도 쿼리에서 직접 바인딩된 변수들도 볼 수 있고 그럭저럭 만족스러운 개발을 진행할 수 있다
그러나 아래와 같이 정돈된 형태로 나오지는 않는다
조금 더 나아가 한눈에 파악하기 더 쉬운 형태로 보고 싶다면 아래 블로그를 참고해보자
설명도 친절하게 되어있고 적용해보기도 쉬우며 p6spy 동작 방식에 대한 이해도 높일 수 있다
치명적인 문제는 아니지만 log4j2, p6spy를 함께 사용한다면 스프링 부트를 띄울 때 아래와 같은 경고를 만나게 된다
log4j2는 log4j-slf4j-impl/2.14.1 을 쓰고 있는데 p6spy는 기본 구현체로 slf4j-simple/1.7.32를 써서 나타나는 오류다
프로그램이 돌아갈 때는 문제가 없으므로 무시해도 된다
2022. 02. 18
예전에 어디선가 p6spy는 logback을 사용해서 로깅을 한다고 봤는데 아마 헛것을 봤나보다
Maven Repository에서 p6spy 검색 후 p6spy spring boot starter 로 메이븐 혹은 그레들로 선택해 넣어주면 되고
최신 버전을 사용한다면 아마 기본 라이브러리로 p6spy 3.9.1이 들어가 있을 것이다
log4j2는 p6spy-log4j2-nodep.jar가 있어야 사용할 수 있는데
3.9.1 버전의 상세한 jar 파일들을 보면 log4j, logback, log4j2 전부 지원한다
바로 위에서 내가 만났던 문제는 소스 코드 상에 @Logj42로 직접 갈겨놔서 그런 듯 싶다
확장성을 고려한다면 당연히 껍데기 인터페이스인 @Slf4j를 써야하기 때문에 얘로 써두면 에러 로그도 뜨지 않게 된다
p6spy는 개발 단계에서는 정말 효과적인 기능이지만 그 비용이 저렴하지 않아 운영 단계에선 추천하지 않는다고 한다
따라서 각 개발 단계에 따라 local, test에서는 p6spy를 사용하고 배포, 운영 단계에서는 log4j2를 사용하면 된다
application.yml에서는 -- 을 기준으로 구획이 나눠지기 때문에 아래와 같이 설정하고
부트를 띄울 때 Active Profiles 설정을 바꿔 돌려주면 된다
p6spy.enable-logging 속성은 default true 값이지만
하나의 application.yml 에서 여러 설정을 하고 있는 경우 명시해주도록 하자
분리해야 하는 설정이 많아진다면 공통 속성을 가지고 있는 application.yml을 두고
application-local.yml, application-prod.yml로 분리하는 것이 나은 선택일 것이다
spring:
config:
activate:
on-profile: local
decorator:
datasource:
p6spy:
enable-logging: true
--
spring:
config:
activate:
on-profile: prod
logging:
level:
org:
hibernate:
SQL: debug
type:
descriptor:
sql:
BasicBinder: trace
decorator:
datasource:
p6spy:
enable-logging: false
인텔리제이 기준으로 상단바에 Edit Configurations... 를 누르면 아래 사진과 같은 화면이 나올 텐데
Active Profiles에 local, dev, prod 등등을 설정해서 여러 개 두고 사용하면 된다
2022. 02. 18
p6spy 로그를 콘솔에도 찍고 파일에도 저장하고 싶다면 다음 글 참고
'Spring > Spring Setting' 카테고리의 다른 글
[Intellij] 구글 코드 스타일 적용, if문 & for문 자동 괄호 없애기 (0) | 2022.02.20 |
---|---|
[P6Spy] p6spy 콘솔에 찍고 로그 파일 저장하기 (0) | 2022.02.18 |
[Gradle] Gradle Build & Test 병렬 실행으로 최적화하기 (0) | 2021.09.09 |
[JPA] Spring Data JPA, QueryDSL setting (0) | 2021.09.03 |
Gradle Multi Module Setting 그레들 멀티 모듈 프로젝트 세팅 (0) | 2021.08.14 |