개발 창고/Web

[Spring] 프로그램의 로깅을 위한 기술 Log4j

로이제로 2020. 8. 3. 16:48
반응형


이 버전에서는 TOC를 지원하지 않습니다. (ex. 모바일)

웹 개발뿐만 아니라 안드로이드 개발 등등에서 콘솔에 보일 로그는 때로 매우 중요하기도 합니다.

로깅은 여러 방법이 있는데 그중에서도 아파치재단에서 제공하는 Log4j는 최근까지도 많이 활용되는 기능입니다. (Spring에서 주로)

 

Log4j란?

log4j는 프로그램을 작성하는 도중에 로그를 남기기 위해 사용되는 자바 기반 로깅 유틸리티이다. 디버그용 도구로 주로 사용되고 있다. log4j의 최근 버전에 의하면 높은 등급에서 낮은 등급으로의 6개 로그 레벨을 가지고 있다. - 위키백과

 

Log4j - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

로깅의 등급으로 총 6가지가 있는데 다음과 같습니다.

  • FATAL
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • TRACE

뒤로 갈수록 Low-level로 전문적으로 로그를 봐야 할수록 FATAL >>>> TRACE라고 보시면 됩니다.

Fatal는 프로그램에 영향을 미칠 수 있는 크리티컬한 내용만을 로그로 표현하는 것을, Trace는 현재 프로그램에서 일어나는 모든 내용을 하나도 빠짐없어 표현한다고 보면 됩니다.

 

일반적으로 개발자들은 DEBUG모드로 개발을 하고 WARN이나 ERROR로 운영에 반영하는 경우가 많습니다.


Spring framework에서 Log4j를 적용하는 방법

Spring에서는 어떻게 쓰일까요?

일단 일반적인 웹서버는 web.xml에서부터 시작을 합니다. (기본적으로 web.xml을 읽을 줄 알면 프레임워크를 이해하는데 유용합니다.)

<web-app
	..
    >

	<!-- //log4j -->
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/config/log4j.properties</param-value>
    </context-param>
    <!-- //log4j -->
    
</web-app>

web.xml에 Log4j를 먼저 Listener로 넣어줍니다.

 

listener는 일반적으로 어떤 이벤트에 대한 처리를 나타내는데, 여기에서는 Log를 어디선가 호출하면 이 Log를 Log4jConfigListener가 처리하도록 지정하는 것입니다.

 

그런 다음 context-param을 통해 log의 위치를 지정해 줄 수 있습니다. 현재 내용은 Log4jConfigListener라는 클래스의 log4jConfigLocation이라는 변수에 "/WEB-INF/config/log4j.properties"라는 위치를 지정해 달라는 명령입니다.

 

이렇게 하면, 웹서버가 구동시 Log4가 실행되면서 Log에 대한 항목을 WEB-INF의 config라는 폴더 내 log4j.properties에서 가져오게 됩니다. (이 위치는 해당 위치에 파일만 있다면, 임의로 변경해도 상관없습니다.)

 

# Log4j configuration
# Log all messages with WARN level.
# Write messages to the console and to a file.
log4j.rootLogger=WARN, console, file, spring

# iBATIS SQL Maps
log4j.logger.com.ibatis=WARN, ibatis, console
log4j.logger.java.sql=WARN, ibatis, console
log4j.logger.java.sql.ResultSet=WARN, ibatis, console

# Spring Framework
log4j.logger.org.springframework=WARN, spring, console
log4j.logger.org.springframework.transaction=WARN, spring, console

# urlRewrite
log4j.logger.org.tuckey.web.filters.urlrewrite=WARN, spring, console

# Application
log4j.logger.com.myapp=WARN, file, console

# Define the console logger.
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=(%F:%L) - %m%n

# Define a file logger.
log4j.appender.spring=org.apache.log4j.DailyRollingFileAppender
log4j.appender.spring.datePattern='.'yyyy-MM-dd
log4j.appender.spring.layout=org.apache.log4j.PatternLayout
log4j.appender.spring.layout.ConversionPattern=%d %-5p %l - %m%n

# Define a file logger.
log4j.appender.ibatis=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ibatis.datePattern='.'yyyy-MM-dd
log4j.appender.ibatis.layout=org.apache.log4j.PatternLayout
log4j.appender.ibatis.layout.ConversionPattern=%d %-5p %l - %m%n

# Define a file logger.
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.datePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %-5p %l - %m%n

 

다음은 WEB-INF - config - log4j.properties 파일 내용입니다.

다음과 같이 로깅을 세팅하면 형식에 맞게 로그가 노출됩니다.

읽는 방법은 일단 #은 주석을 위한 용도로 활용되기 때문에 #라인은 제외하고

 

log4j.rootLogger=WARN, console, file, spring

 

라는 부분 보면, log4j.rootLogger에서 나오는 로그 (전체 로그) 중 로깅 단계가 WARN(이전의 6단계 중) 이상의 단계 (FATAL, ERROR, WARN)에 대해서만 console과 file, spring에 호출해 주세요 라는 메시지입니다.

 

이는 전체 로그에 대해 경고 단계에  대해서 해당 3곳에 로그로 남겨달라는 이야기입니다.

 

그리고 이 console이나 file, spring은 하단의 log4j.appender.{위치} 의 설정에 따라 로그가 남게 됩니다.

 

log4j.appender.console은 org.apache.log4j.ConsoleAppender로 콘솔창에 호출되도록 설정된 경우이고, org.apache.log4j.PatternLayout 형태로 콘솔창에 한 줄로 로깅됩니다. 그리고 기록될 때, 날짜 나 패키지 명 등은 ConversionPattern에 따라 다르게 기록됩니다.

 

DailyRollingFileAppender는 일자별로 log파일에 기록되는 방식인데 datePattern에 '.'yyyy-MM-dd로 한 경우

>>>> spring.2020-08-02

라는 로그 폴더로 나는 것을 서버에서 확인할 수 있습니다.

반응형