공부할 때나 들어온지 얼마 안 되었을 때 디버깅에 대한 중요성을 전혀 인지하지 못하고 있었다. 막 코딩을 시작해서 배울 때는 "안 그래도 정신없는데 복잡하게 logging을 왜함 error나 exception 처리만 잘 해두면 되지"라는 생각을 하고 있었는데 점점 복잡한 소스들에서 error조차 뱉지 않는 그런 무시무시한 녀석들을 만나다 보니 debugging에 대한 중요성과 logging은 선택이 아닌 필수라는 생각이 들었다.
이렇게 중요한 logging, 대부분의 언어들이 log처리를 위한 라이브러리들이 있다. 그 중에서 내가 주로 사용하는 JAVA는 JDK에서 기본적으로 제공하는 Java.util.logging이 있지만 기능이 거의 없는 수준이라 Apache Commons Logging이나 log4j를 사용한다.
오늘 정리할 log4j는 Log for J(java)로
이러한 장점들을 가진 녀석이다. 그리고 내가 느낀 큰 장점중 하나인 표준화가 되어있어서 협업시에 유리하다는 장점은 Apache Commons Logging으로 자기 입맛대로 구성되어 있는 로그보다 가독성이 좋아서 개발속도에 불을 붙여주는 역할을 하는 것 같다. format가 다른 것도 신경쓰이는데 각자가 만든 페이지마다 로깅이 다르면...많이 짜증날듷하다
일단 이번 프로젝트는 전자정부 프레임워크 3.10 기반인데 3.7 쓰다가 최신버전은 새롭기도 하고 아직 바쁜 기간이 아니기도하고 가장 중요한 것은 템플릿이긴 하지만 아직 구성되지 않은 깔끔한 상태의 개발은 처음이라 매우 설레이는 중이다. (4개월 차라 개발프로젝트긴 한데 거의 유지보수격의 개발만 함)
그런 설레임을 안고 이것저것 세팅을 해보던 중에 콘솔에 log가 맘에 들지 않았다. 먼저 "org.quartz.core.QuartzSchedulerThread"에서 10초~20초마다 계속 batch trigger를 로그에 표출하는 문제, 전에 개발하던 프로젝트의 경우 미리 세팅이 되있어서 sql log가 변수값이 다 들어간 상태로 나왔으나 다 '?'로 나와서 debuging시에 긁어가서 확인하기도 불편하고 가독성도 좋지 않아 몇가지 log4j의 변경사항을 적용했다.
전자정부 프레임워크 3.10 기준으로 log4j2.xml 파일에
<!-- batch acquisition of triggers DEBUG -> ERROR(batch가 콘솔에 분단위로 찍히는 것 방지) -->
<Logger name="org.quartz.core.QuartzSchedulerThread" level="ERROR" additivity="false">
<appender-ref ref="console" />
<appender-ref ref="file" />
</Logger>
를 추가해서 debug 단위로 console에 출력하는 QuartzSchedulerThread 부분은 ERROR시에 console에 표출될 것이다. 여기서 logger의 level이란, 아래의 단계로 console이나 file에 logging을 보여준다.
먼저 수정한 내 log4j2.xml이다.
<Logger name="java.sql" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<Logger name="jdbc.sqlonly" level="INFO" additivity="false">
<AppenderRef ref="console" />
</Logger>
<!-- log SQL with timing information, post execution -->
<Logger name="jdbc.sqltiming" level="OFF" additivity="false">
<AppenderRef ref="console" />
</Logger>
<!-- 로그출력 많은 것들 off 처리, 로그확인할때는 주석처리로 확인 -->
<Logger name="jdbc" level="OFF"/>
<Logger name="jdbc.connection" level="OFF"/>
<logger name="jdbc.audit" level="OFF"/>
<Logger name="jdbc.resultset" level="OFF"/>
<Logger name="jdbc.resultsettable" level="OFF"/>
<Root level="INFO">
<AppenderRef ref="console" />
</Root>
각자의 스타일에 맞게 logging 정도를 조정하면 되는데 위에서 언급한 level에 따라 log의 범위를 조절하면 최적화가 가능할 것이다.
xml을 수정해서 debug level의 내용은 콘솔에서 표시하지않았다. 에러가 나거나 debugging을 해도 잘못된 부분을 발견하지 못한다면 level 영역을 넓혀서 debugging을 하면 되니 나는 실행될 때마다 콘솔창이 너무 길어지는 것보다 jdbc.sqlonly로 info영역에서 mybatis 쿼리를 읽는 방법을 택했다. 여기 까지 수정을 해도 변수값에 대한 처리가 되지 않을 것이다. 이제 전자정부의 globals.properties에 간다. 만약 이 파일이 없다면 context-datasource 부분에서 직접 처리할 수 있으니 확인후에 아래처럼 수정하면된다. 그리고 나는 oracle에 log4jdbc가 1.2이다.
Globals.oracle.DriverClassName=oracle.jdbc.driver.OracleDriver를 아래 내용으로 변경
Globals.oracle.DriverClassName=net.sf.log4jdbc.DriverSpy
Globals.oracle.Url=jdbc:oracle:thin:@192.168.0.60:1521:oradraco를 아래 내용으로 변경
Globals.oracle.Url=jdbc:log4jdbc:oracle:thin:@192.168.0.60:1521:oradraco
각자의 소스에 상관없이 DriverClassName은 위에 내용으로 변경하고 아래에 url은 jdbc:oracle 사이에 log4jdbc를 추가해준다. (jdbc:log4jdbc:oracle)
이렇게 추가가 끈나면 변수값의 ?에 값이 들어오게된다. 여기까지가 기본적인 세팅이고 콘솔에 level에 따른 글씨 색상, 정렬등 여러가지 수정할 수 있는 부분들이 있으니 찾아보면 가독성 좋은 logging을 구성 할 수 있을 것이다.