ejyoo's 개발 노트

Log4J 적용 본문

BackEnd/Java

Log4J 적용

ejyoovV 2021. 3. 18. 21:35

Log4J에 대해 정리해보고자 합니다.

 

💡 LOG4J

Log4J는 Java를 위한 빠르고 유연한 로깅 프레임워크라고 합니다.

저같은 경우에는 로그를 찍을 때, System.out.println()을 사용하여 로그를 찍었었는데요.

이것은 가장 단순한 방법이라고 합니다.

 

Log4J를 이용하면 프로그램 실행 시 

실행 코드의 수정 없이 설정 파일을 통해서 로깅 작업을 컨트롤 할 수 있습니다.

Log4J의 특별한 기능 중 하나는 로거의 상속 개념의 사용입니다.

Logger 계층 구조를 이용하면 어떤 로그문을 출력할 지 상세하게 컨트롤 하기가 쉬워집니다.

 

💡 LOG4J의 주요 구성 요소

  • Loggers : 로깅 정보를 캡쳐한다.
  • appenders : 다양한 목적지로 로깅 정보를 출력한다.
    • ConsoleAppender, FileAppender, JDBCAppender, JMSAppender, SMTPAppender, SocketAppender, SyslogAppender
  • layouts : 로깅 정보를 위한 다양한 출력 포맷 구성

💡 LOG4J의 로그 레벨

  • DEBUG : 애플리케이션 디버그 시 유용한 모드
  • INFO : 정보성 메시지 출력 모드 일반적으로 많이 사용함.
  • WARN : 잠재적인 위험(경고) 메시지 출력을 위한 모드
  • ERROR : 애플리케이션 실행 중 발생하는 에러메시지 출력 모드
  • FATAL : 심각한 에러메시지 출력모드(애플리케이션이 실행을 멈추게 할 수 있음)

💡 LOG4J의 우선순위

DEBUG < INFO < WARN < ERROR < FATAL

 

💡 LOG4J의 설정방법

- 사이트에서 라이브러리 파일 (.jar) 다운로드 및 설치한다.

- 설정 파일 (log4j.properties 또는 log4j.xml) 을 클래스 패스 위치에 생성한다.

- 설정파일의 설정 항목을 통해서 로깅레벨 및 로깅처리 정보를 설정한다.

 

💡 LOG4J의 설정 실습 수행

이전에 생성한 iBatis 프로젝트를 사용하여 Log4J를 설정하겠습니다.

📝 Log4J를 적용하기 위해서 먼저 jar 파일을 Log4J를 적용할 폴더에 Build Path를 해줍니다.

우클릭 - Configure Build Path

 

다운로드 받은 jar 파일을 추가함

📝 설정파일을 Project 내 res 폴더에 넣어줍니다.

📝 설정파일을 세팅합니다.

현재 기본 로그 출력 레벨은 ERROR 입니다.

 

📝 로그를 남길 영역에 Logger를 생성합니다.

아래 사진은 member.xml 내 쿼리를 수행하기 전, 데이터를 세팅하는 DAO에 설정된 로거입니다.

DAO 에서는 SQL 쿼리를 수행하기 위한 데이터를 세팅하고, 그 결과를 Service에 넘겨주는 작업을 하는 클래스입니다.

따라서 필요한 로거는 파라미터를 넘겨주는 로거와 최종 결과가 어떻게 나오는지만 필요할 것 같아서

아래와 같이 코드를 작성합니다.

위의 log4J.properties에서 설정된 기본 로그 출력 레벨은 ERROR입니다.

즉 로그 출력 레벨은 DEBUG < INFO < WARN < ERROR < FATAL 입니다.

이대로라면, 레벨 설정으로 인해 로그가 아무것도 찍히지 않아야 합니다.

확인해보겠습니다.

로그가 아무것도 찍히지 않네요.

설정파일로 다시 넘어가서 로그 레벨을 변경해보겠습니다.

현재 DAO에서 작성한 로그레벨은 DEBUG와 WARN입니다.

이 로그가 찍히기 위해서는 로그 출력레벨을 최 하단인 DEBUG로 설정해야 합니다.

다시 실행해봅니다.

실행 결과에 제가 만든 로그가 찍혔습니다.

출력 결과에 제가 설정하지 않은 로그들도 출력레벨을 DEBUG로 설정하니 보이게 되었는데요.

이는 iBatis에서 작성한 로그로 추측이 됩니다.

 

다시 본론으로 돌아와서

빨간색 네모 박스로 되어있는 곳은 Parameter에 대한 로거를 생성하여 로그를 찍은 결과. 파라미터에 대한 로그를 확인할 수 있고

파란색 네모 박스로 되어있는 곳은 결과가 찍혔습니다.

 

콘솔에 로그가 찍힌 이유는 설정파일인 log4j.properties에서 

'log4j.appender.stdout.Target=System.out 으로 로깅을 남길 장소로 설정하여 콘솔에 로그로 남은것으로 판단됩니다.

 

그리고 SQL 관련 로거를 생성하는 코드도 저는 가지고 있지만, 

ibatis에서 SQL 관련 로그를 출력하는 것 같아 추가로 SQL 로거를 생성하지 않았습니다.

코드만 정리해놓고 적용할 수 있는 것만 적용하겠습니다.(SQL 로거는 사용 안하겠음)

//	Log4J를 이용한 로그를 남기기 위한 로그를 생성한다.
//	Logger.getLogger(클래스객체||String경로);
//	SQL 관련 로거 생성
//	private static final Logger SQL_LOGGER = Logger.getLogger("log4jexam.sql.Query");

 

아직은 배우는 단계라 깊게 파진 않고

이정도까지만 공부하고 현재 적용한 사례를 들어 다른 파일에도 Log4j를 적용해보도록 하겠습니다.

 


Log4J를 이전에 생성한 iBatisBoard에 적용하려 합니다.

 

일단 먼저 적용할 파일에 log4j 프레임워크를 쓰기 위해 jar 파일을 설정합니다.

 

 

log4j의 설정파일은 2가지 종류가 있는데 (log4j.properties , log4j.xml)

그 중 log4j.properties를 추가합니다.

 

res 설정파일이 담겨질 소스파일 폴더에 log4j.properties를 추가합니다.

(저는 위에 작업한 파일을 그대로 복사하여 갖다놓았습니다.)

설정파일에 대한 정보는 위의 글을 참고합니다.

이제 DAO에 Logger를 생성하고 출력할 로그를 작성합니다.

이렇게 설정한 뒤 Main에서 실행하여 게시글을 1개 작성해보겠습니다.

log4j.properties에서 로그 출력 모드는 DEBUG입니다.

이 설정대로라면 제가 작성한 DEBUG, RESULT_LOGGER가 보여야 합니다.

출력이 올바르게 되었습니다.

 

이 Log4j로 인하여 예전에는 sysout을 통하여 로그를 찍고 필요없을 시, 지우고 해서 번거로웠는데

모드별로 출력할 로그를 정해서 실제 코딩에 사용한다면 아주 유용할 것 같습니다.