The Boxer
log4j를 사용한 logging 본문
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 | 로깅 이벤트가 발생한 시간 출력 |
%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/
'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 |