Top

log4jdbc-log4j2 선택적 로깅 방법

1. log4jdbc-log4j2의 이점


log4jdbc-log4j2를 적용하면 아래와 같은 이점을 얻을 수 있다.

  • Prepare Statement로 설정한 쿼리에 대한 파라미터를 자동으로 매핑해서 실제로 돌아가는 쿼리를 로깅해줌
  • 실행 시간 및 실행 결과를 자동으로 표시
  • 일정 실행 시간 이상 수행된 쿼리의 경우 log 레벨을 자동으로 warn이나 error로 변경 할 수 있어 성능 이슈에 대해서 쉽게 모니터링 할 수 있음

http://log4jdbc.brunorozendo.com/

 

2. 특정 쿼리는 로그를 남기고 싶지 않다.


하지만 사람의 욕심은 끝이 없는 법

편리한 쿼리 자동 로깅 기능이지만 특정한 쿼리는 로그를 남기고 싶지 않다는 생각을 하게된다.

(백그라운드로 돌아가는 job이나, 시스템이 자동으로 돌리는 쿼리들, 그리고 입력 자체를 제한해서 오류가 날 가능성이 적은 쿼리, 혹은 너무 많이 수행되서 디버그할 때 방해가 되서 로그를 찍고 싶지 않다던지…)

하지만 이런 경우 log4jdbc를 이용하면 쿼리를 찍지 않을 방법이 없다.

혹시 log4jdbc에 그런 옵션이 자체적으로 있는게 아닐까 생각해서, 찾아봤지만 아래 처럼 SELECT, UPDATE, CREATE, DELETE 구문을 통째로 disable 시키는 옵션만 존재했다.

아니면 다른 사람들도 분명히 나처럼 특정 쿼리를 로깅하지 않는 기능이 필요할거라고 생각해서 열심히 구글에 검색을 해봤지만 이것도 마땅한 방법이 나오지 않았다.

 

3. 없으면 꼼수로 만들어보자


목마른 사슴이 우물을 찾는 심정으로 없으면 만들어보자

기본 아이디어는 다음과 같다.

  • log4jdbc가 jdbc 드라이버 사이에 끼어서 해당 쿼리를 자동으로 로깅하게됨
  • 로그를 남기고 싶은 쿼리와 남기고 싶지 않은 쿼리를 접속할 datasource를 따로 두어서 분리하자
    (역발상~!! 나는 천재야~!! ㅋㅋ)
  • datasource에 대해서 메소드 별로 지정할 수 있으면 좋겠고, 복잡한 설정 보다는 간단한 annotation을 통해서 지정할 수 있으면 좋겠다.
  • 기본적으로 annotation하지 않으면 logging용 datasource를 사용할 수 있도록 만들자
  • 성능상에 이슈가 생기면 안되므로 db pool 기능을 사용할 수 있어야 한다.

 

annotation을 통해서 여러개의 db를 동적으로 접근하는 방법은 다행히 많은 자료가 있었다.

내가 참고한 자료는 아래와 같다.

http://sidnancy.kr/2014/02/04/DataSource-Routing-in-several-ways-to-Spring-MyBatis.html

기본 아이디어는 DataSource에 대해서 AbstractRoutingDataSource을 이용해 추상 DataSource를 지정해 놓고

AOP를 통해서 서비스가 실행되는 시점에 정해 놓은 Rule에 따라서 사용할 DB를 결정하게 하는 것이다.

위와 같은 정보에서 DataSource 정보만 동일한 DB의 logging을 위한 DB, Logging을 하지 않을 DB로 접속 정보를 분리해 놓고

annotation에 따라서 지정한 쿼리를 사용하면 내가 원하는 기능이 지원된다.

 

4. 주의사항 및 이슈


AbstractRoutingDataSource가 신기해서 검색해보니 해당해서 몇가지의 주의 사항 혹은 이슈가 검색된다.

 

 – 트랜잭션 처리

http://kwonnam.pe.kr/wiki/springframework/abstractroutingdatasource

http://egloos.zum.com/kwon37xi/v/5364167

AbstractRoutingDataSource가 일단 임시 DataSource를 리턴하고, 실제 DB에 대한 커넥션은 뒷 부분에서 맺으므로 Transaction과 생명주기를 고려해야 한다.

 

 – 성능 이슈

http://knight76.tistory.com/

DataSource를 계속해서 새로 맺으면서 생기는 성능 이슈

나의 경우는 AbstractRoutingSource가 BoneCP DB Pool을 사용하도록 구성해서, 매번 Connection이 맺어지지 않도록 수정했다.

실제 운영환경에서 테스트해봐야겠지만 현재는 특별한 성능 이슈는 없다.

 

5. 기타 정보


특정 쿼리를 로깅하지 않는 방법을 찾아보다가 발견한 정보를 공유한다.

http://totoro3040.blogspot.kr/2015/05/logbackxml.html

logback에 filter 기능을 이용해 로깅 메세지에 특정 문자열이 있으면 logging하지 않도록 해서 특정 쿼리에 대한 로깅을 제외하는 아이디어다.

쿼리만 로깅하는 경우는 간단하게 위 기능을 이용해서 구현해도 된다.

나 같은 경우는 log4jdbc의 jdbc.resultsettable을 활성화해서 사용하기 때문에 쿼리가 찍히지 않아도 결과는 찍혔기 때문에 해당 기능으로 구현하지 않았다.

 

logback에 필터에 대한 공식 문서 : https://logback.qos.ch/manual/filters.html

logback에 대한 한글 문서 : https://seungbeomi.blog.me/50184162669

 

mybatis 인터셉터를 이용한 로깅 방법

-> log4jdbc를 사용하지 않고 자체적으로 쿼리 로깅을 구현하기 때문에 로깅 유무를 자신이 결정할 수 있다.

출처 : http://mangoseven.tistory.com/4

kaze

Test

No Comments

Post a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.