The Boxer

log4j를 사용한 logging 본문

Java

log4j를 사용한 logging

Prower 2018. 7. 17. 19:54
728x90
반응형

log4j를 사용해 자바에서 logging 기능을 구현해 봅시다.


[Logging]

logging은 프로그램을 디버깅 혹은 사용중에 발생하는 오류를 모니터링하기 위해 필요한 정보(log)를 기록하는 행위.

가령 프로그램 실행 중 어떤 메소드가 성공 혹은 실패를 하였는지, 시간을 얼마나 사용하는지에 대해 파악하는 용도로 사용.

Java에서 기본적으로 제공되는 System.out또한 logging의 일종으로 볼 수 있음. 

-> Logging은 프로그램 실행 중 정보를 기록하는 행위


[log4j]

apache에서 제작한 Java용 logging 유틸리티.


특징

- 기본출력보다 속도가 빠름

- 다양한 프레임워크에 적용 가능

- Layout 설정으로 다양한 형태로 출력 가능


log4j의 구조

log4j는 3가지 구조로 이루어짐

- Logger : logging 메세지를 Appender에 전달하며, 로그레벨과 로그출력 여부를 결정.

- Appender : 로그의 출력 위치를 결정하여 출력.(파일, 콘솔, DB...)

- Layout : 로그 출력 형식을 정의..


log4j의 레벨

log4j는 출력 레벨을 설정할 수 있음. 출력 레벨을 설정하면 설정된 레벨보다 낮은 레벨의 logging은 출력되지 않음.

실제 현업에서는 엄청난 양의 log가 쏟아지는데 너무 방대한 양이 쏟아지면 관리가 어려우므로 레벨을 설정하여 사소한 log는 출력하지 않도록 함

- log4j에서 설정 가능한 레벨

FATAL - ERROR - WARN - INFO - DEBUG - TRACE 순으로 레벨이 낮아지며 log4j에서 출력할 로그 수준을 설정. 
(WARN으로 설정할 경우 FATAL에서 WARN까지의 log가 출력됨)

모든 레벨의 log를 다 출력하게 할 수 있지만, 그럴 경우 log의 양이 너무 많아져 logging의 의미가 없어짐.


Log4j 출력 패턴 설정

log4j의 출력 양식을 정의하는 기능.

- 출력 양식

%p

 로그 레벨 출력

 %m 

 로그 내용 출력 

%d

 로깅 이벤트가 발생한 시간 출력
 형식 예) %d{HH:mm:ss}  

%t 

 로깅 이벤트가 발생한 쓰레드의 이름 출력

%F

 로깅 이벤트가 발생한 프로그램 파일명 출력 

%l 

 로깅 이벤트가 발생한 caller의 정보 출력 

%L 

 로깅 이벤트가 발생한 caller의 라인 수 출력

%M 

 로깅 이벤트가 발생한 method 이름 출력 

%n 

 개행문자 출력 

%C 

 클래스명 출력 


log4j의 클래스

log4j의 출력 위치를 정의하는 클래스

ConsoleAppender

 콘솔에 로그 메세지 출력

FileAppender 

 파일에 로그 메세지 출력 

RollingFileAppender 

 파일의 크기가 일정 수준 이상이 되면 로그 파일을 백업파일로 바꾸고 새로 기록 

DailyRollingFileAppender

 일정 기간 단위로 로그 파일을 생성하고 기록

JDBCAppender

 DB에 로그를 출력


[slf4j]

java에는 logging 기능을 제공하는 다양한 유틸리티(log4j, logback...)가 존재함.

slf4j는 이러한 logging모듈의 추상체. 추상체이기 때문에 다양한 framework에 연결하여 사용할 수 있음. 

이로인해 유연한 개발이 가능하주로 너무 사소고, 어떠한 logging 모듈에 대해서도 적용해서 사용할 수 있음.


[Maven에서 사용하는 방법]

1. slf4j의 dependency는 https://mvnrepository.com/artifact/org.slf4j5 에서 확인가능.

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>


2. 우리는 log4j를 사용할 것이므로 log4j에 binding하는 dependency를 추가

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>


3. dependency를 추가하고 나면 log4j가 사용할 설정파일이 필요함. 설정파일에는 출력위치, 출력 주기, 내용, 패턴등을 설정하여 적용할 수 있음

설정파일은 xml, properties파일로 작성 가능. 다음은 필자가 작성한 예시 xml파일

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true"
xmlns:log4j='http://jakarta.apache.org/log4j/'>

<appender name="console" class="org.apache.log4j.ConsoleAppender"> <!--콘솔 출력부분-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %C{1} - %m%n" /> <!--출력 패턴 설정... %C{1} 은 이벤트가 발생한 클래스만 출력-->
</layout>
</appender>

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> <!--파일 출력 부분-->
<param name="Append" value="true" />
<param name="file" value="logs/astroClient/astro.log"/> <!--저장 위치 설정-->
<param name="DatePattern" value="'.'yyyy-MM-dd"/> <!--날마다 백업파일 설정-->
<rollingPolicy name="Policy" class="TimeBasedRollingPolicy"> <!--시간간격 1일-->
<param name = "interval" value= "1"/>
</rollingPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="[%p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %C{1} - %m%n" />
</layout>
</appender>


<root> <!--설정을 root에서 관리-->
<level value="INFO" />
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>

</log4j:configuration>


4. log4j를 사용할 주비가 완료됨. Logger를 import하고 Logger 인스턴스를 생성 한 후 레벨에 따른 출력으로 사용 가능

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoggerEx {
public Logger logger = LoggerFactory.getLogger(this.getClass());

public static void main(String[] args) {
LoggerEx log = new LoggerEx();

log.logger.info("info");
log.logger.error("error");
log.logger.debug("debug");
}
}

LoggerFatory의 getLogger는 현재 사용하는 클래스의 이름을 변수로 받아 logger로 반환합니다. 이후 logger객체로 info, error, debug등의 logging 출력.


출력결과

------------------------------------------------------------

INFO  LoggerEx.main(LoggerEx.java:11) - info
ERROR LoggerEx.main(LoggerEx.java:12) - error
DEBUG LoggerEx.main(LoggerEx.java:13) - debug

------------------------------------------------------------


[참고자료]

- 자바에서 logback을 사용해야 하는 이유
https://thinkwarelab.wordpress.com/2016/11/11/java%EC%97%90%EC%84%9C-logback%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B9%85logging-%EA%B0%9C%EC%9A%94/

- slf4j Manual
https://www.slf4j.org/manual.html

- println과 logback 비교
http://madeinjeon.tistory.com/18

- Log4j 정의와 구조, 설정
http://cofs.tistory.com/354
http://changpd.blogspot.com/2013/05/spring-lo4j.html

- how to java
https://howtodoinjava.com/log4j/how-to-configure-log4j-using-xml-configuration/

- xml 예제
https://www.mkyong.com/logging/log4j-xml-example/


728x90
반응형

'Java' 카테고리의 다른 글

자바 용어정리Spring - Beans와 POJO  (0) 2018.11.23
Synchronized  (0) 2018.10.19
Lombok  (0) 2018.10.02
Calllback과 Synchronous/Asynchronous  (0) 2018.09.27
Interface를 사용한 Callback 구현  (0) 2018.07.16
Comments