티스토리 뷰

진행하고 있는 프로젝트에서 logging library로 log4j2를 사용하고 있다

후보로는 log4j, logback, log4j2 등이 있었는데 performance 결과를 비교한 것을 보고 바로 정할 수 있었다

log4j2는 비동기 방식으로 처리되기 때문에 다른 slf4j 구현체들을 압살 하는 성능을 가지고 있다

성능이 미친듯이 뛰어나기 때문에 오류 또한 logback에 비해 훨씬 덜 나는 건 보너스다

스프링 부트를 사용하는 경우, 설정 또한 크게 어렵지 않기 때문에 학습 & 성능 향상 목적으로 도입했다

 

https://logging.apache.org/log4j/2.x/performance.html

 

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 동작 방식에 대한 이해도 높일 수 있다

 

쿼리 튜닝을 편하게! p6spy 개조하기

🚫 주의! 굉장히 비싼 자원을 사용하므로 운영 환경에선 절대 사용하지 말 것을 권장드립니다. ✅ 개발 환경 모든 소스코드가 보고 싶으시다면 GitHub🎁 를 참고해주세요. Java 11 Gradle 7.0.2 Spring-Bo

hch4102.tistory.com

 

 

치명적인 문제는 아니지만 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 로그를 콘솔에도 찍고 파일에도 저장하고 싶다면 다음 글 참고

 

 

[P6Spy] p6spy 콘솔에 찍고 로그 파일 저장하기

Spring + JPA 사용 시 JPA 구현체 중 하나인 Hibernate가 제공하는 꿀 기능이 있다 show_sql, format_sql 두 속성인데 sql을 정렬된 상태로 볼 수 있게 해 준다 여기에 logging 하위 속성이 제공하는 BasicBinder..

ryumodrn.tistory.com

 

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday