Logging
Logging은 프로그램 실행 중 정보(성공, 실패, 시간, 횟수 등)를 기록하는 행위로 System.out.println() 또한 logging의 일종이다.
System.out.println()
대부분의 개발자들은 로그를 찍기 위해 System.out.println() 메서드를 사용한 시스템 로그를 많이 사용한다. 이 방법은 가장 간단하고 쉽긴 하지만 서비스 운영중엔 확인이 어렵고 성능에 영향도 많이 준다.
파일이나 콘솔에 로그를 남길 경우 내용이 완전히 프린트되거나 저장될 때까지, 이후 프린트하려는 작업은 대기할 수 밖에 없다. 이 대기 시간은 또한 시스템의 성능에 의존하게 된다.
더 큰 문제는 보통 개발을 하는 사람과 서비스를 운영하는 사람은 다르기 때문에
System.out.println()같은 개발에서만 사용되는 출력 방식은 운영 측에서 확인이 불가능하다.
Log4j
Log4j는 프로그래머가 로그의 출력을 다양한 대상과 형태로 출력할 수 있도록 해주는 도구이다.
날짜/시간/로그 생성자/ 타입(ERROR, INFO, DEBUG 등) 등 다양한 정보를 로그와 함께 기록할 수 있어서 필터링이 가능하고 저장 위치와 방식도 변경이 가능하여 기록하고 가져올 수 있고 성능또한 System.out.println보다 우수하다.
Log4j 사용하기
og4j 플러그인 import
- Servlet 환경의 경우 WEB-INF 안에 log4j.jar 넣기
- Maven 환경의 경우 <dependency> 추가
- Gradle 환경의 경우 build.gradle 에 내용 추가
참고 : https://mvnrepository.com/artifact/log4j/log4j/1.2.17
log4j.xml 설정 입력 ( src/main/resoruces/ )
<?xml version="1.0" encoding="UTF-8"?>
<appender name="Appender_NAME" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="/path/log4j.log"></param>
<param name="DatePattern" value="yyyy.MM.dd"></param>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %-5p %c %x - %m%n"></param>
</layout>
</appender>
<logger name="logger1" additivity="false">
<level value="debug"></level>
<appender-ref ref="Appender_NAME"></appender-ref>
</logger>
<logger name="logger2" additivity="false">
<level value="debug"></level>
<appender-ref ref="Appender_NAME"></appender-ref>
</logger>
<log4j-configuration>
- 로그 출력을 위한 Log4j 설정
<appendar>
- <log4j-configuration>의 하위 태그
- name : 로그 Appender 설정을 구분할 이름
- class : 로그를 출력할 방법( 파일 or DB or 콘솔 외 등등 ) Appender 클래스 지정
- VALUE : “org.apache.log4j.DailyRollingFileAppender” : 지정한 시간 단위로 파일 출력
- DailyRollingFileAppender의 경우 DatePattern 지정 필요
ConsoleAppender
|
콘솔에 로그 메세지 출력
|
FileAppender
|
파일에 로그 메세지 출력
|
RollingFileAppender
|
파일의 크기가 일정 수준 이상이 되면 로그 파일을 백업파일로 바꾸고 새로 기록
|
DailyRollingFileAppender
|
일정 기간 단위로 로그 파일을 생성하고 기록
|
JDBCAppender
|
DB에 로그를 출력
|
<param>
- <log4j-configuration>의 하위 태그
- File : .log 파일 생성 위치,
- DatePattern : 지정한 날짜마다 로그 파일을 갱신
- ex) “yyyy.MM.dd” : 매일 자정에 기존 로그 파일 저장 후 새 로그 파일로 변경
<layout>
- class : 로그 출력 형식에 대한 Layout 클래스 지정
- PatternLayout 으로 지정했을 경우 사용자가 패턴 지정 가능
- <param name : “ConversionPattern” value=”%d{ISO8601} %-5c %c %x - %m%n
%p
|
로그 레벨 출력
|
%m
|
로그 내용 출력
|
%d
|
로깅 이벤트가 발생한 시간 출력
형식 예) %d{ISO8601} 혹은 %d{HH:mm:ss}
ISO8601 : yyyy-MM-dd HH:mm:ss
|
%t
|
로깅 이벤트가 발생한 쓰레드의 이름 출력
|
%F
|
로깅 이벤트가 발생한 프로그램 파일명 출력
|
%l
|
로깅 이벤트가 발생한 caller의 정보 출력
|
%L
|
로깅 이벤트가 발생한 caller의 라인 수 출력
|
%M
|
로깅 이벤트가 발생한 method 이름 출력
|
%n
|
개행문자 출력
|
%C
|
클래스명 출력
|
<logger>
- <log4j-configuration>의 하위 태그
- name : 로그 파일을 작성하는 로직이 담긴 클래스
- additivity : 로그 중복 출력 ( false : 중복 출력 X )
<level>
- <logger>의 하위 태그
- value : 로그 레벨 설정 FATAL > ERROR > WARN > INFO > DEBUG > TRACE 순
- DEBUG 레벨로 지정했드면 FATAL ~ DEBUG 까지 로깅
<appender-ref>
- <logger>의 하위 태그
- ref : <appender> 태그의 name 속성의 값 입력하여 참조
Logging할 클래스에 Log4j 클래스 불러오기
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");
}
}
출력결과
------------------------------------------------------------
INFO LoggerEx.main(LoggerEx.java:11) - info
ERROR LoggerEx.main(LoggerEx.java:12) - error
DEBUG LoggerEx.main(LoggerEx.java:13) - debug
------------------------------------------------------------
예시
FATAL : 아주 심각한 오류 ( 애플리케이션 작동 불가 등 )
ERROR : 요청 처리 실패 ( 초기화 실패 등 )
WARN : 프로그램 실행엔 문제가 없을 수도 있는 오류
INFO : 정보
DEBUG : 디버그 용도 ( 작업 수행 시간 등 Dev 참고용 )
TRACE : DEBUG 보다 상세한 로그를 남기는 용도
'Back-End > Java & Spring' 카테고리의 다른 글
[JAVA] 제네릭 표현 (0) | 2022.08.17 |
---|---|
[JAVA-Spring] 가변적인 Parameter 처리 (0) | 2022.08.02 |
[JAVA] JNDI( Java Naming and Directory Interface ) (0) | 2022.08.02 |
[JAVA] Apach Axiom API (XML Parser) (0) | 2022.08.02 |
[JAVA] JVM 메모리 구조와 라이프 사이클 (0) | 2022.08.02 |