개요
이 포스팅은 자바에서 사용되는 "로그"에 대한 라이브러리 종류와 그 사용법을 기술한다.
1. 로그란?
2. 로깅 라이브러리 종류
3. 로그 구조
4. 로그 설정
1. 로그란?
모든 행위와 이벤트 정보를
시간의 경과에 따라 기록한 데이터
시스템 상에서 "로그" 를 생성하는 과정을
"로깅(Logging)"
이라고 한다.
로깅(logging)의 장점
개발 프로그램의 디버깅
예기치 못한 문제의 원인 파악
시스템 및 사용자의 동작 패턴 분석
해킹(침입)의 비정상 동작의 기록을 감지
분석을 통한 통계화
즉, 모든 것을 기록하고 분석하여 예측하게 해주는 장치라고 할 수 있다.
2. 로깅 라이브러리 종류
로깅 라이브러리는 프로그램을 실행하는 도중에 로그를 남기기 위해 사용되는 유틸리티이다.
java.util.logging (jdk8)
JDK에 내장된 기본 로깅 라이브러리.
JDK 1.4부터 포함된 표준 로깅 API
Apache Commons logging
Apache 재단의 Commons 라이브러리 중에 로그 출력을 제공하는 라이브러리
log4j
Aapache 재단에서 만든 log4j는 2001년에 처음 릴리즈된 자바의 로깅 라이브러리이다.
가장 널리 사용되는 로깅 라이브러리
Logback
Log4j를 개발한 Ceki Gulcu가 Log4j의 단점 개선 및 기능을 추가하여 개발한 로깅라이브러리
3. 로그 구조
제공되는 3rd-party 라이브러리마다 구조의 표기 방식은 다를수 있지만, 대게 같은 의미를 내포하고 있다.
이후 설명은 가장 많이 사용하는 log4j를 기준으로 설명을 이어간다.
로그 구조
log4j 계층구조로 되어있으며 코어층(Core Layer)과 서포트층(Support Layer)이 있다.
코어층이 서포트층을 유기적으로 응용하여 코어층에서 메시지를 핸들링한다.
로그 구조 | 설명 |
Core Layer | |
Logger |
가장 상위계층으로 로깅 정보를 받는 계층 로그 레벨을 결정 |
Layout | 출력되는 문자열 스타일을 포맷하는 계층 어떻게 기록할지를 결정 |
Appender | 여러 장치로 내보내는 계층 출력 위치를 결정(파일, 콘솔, DB 등) |
Support Layer | |
Level | 로깅 수준을 결정 |
Filter | 로깅 여부를 Appender에 제공하는 역할 |
ObjectRender | 객체를 문자열로 바꾸어 Layout에 제공하는 역할 |
LogManager | 설정 파일에서 로깅 프레임워크를 관리하는 역할 |
로그 레벨
로그 표기의 범위를 지정
로그레벨 | 설명 |
TRACE | 모든 메시지를 표시하기 위한 정보 |
DEBUG | 프로그램 디버깅하기 위한 정보 |
INFO | 상태변경, 서비스 동작 상태를 위한 정보 |
WARN | 향후 잠재적으로 문제를 야기할 수 있는 정보 |
ERROR | 의도하지 않은 오류 발생 정보 |
FATAL | 시스템적으로 심각한 문제가 발생해서 어플리케이션 작동이 불가능한 정보 |
"TRACE ⊃ DEBUG ⊃ INFO ⊃ WARN ⊃ ERROR ⊃ FATAL"의 범위 만큼 로깅이 된다. Ex) INFO 레벨이면 "INFO ~ FATAL"까지 로깅한다. |
Appender
log4j에서 제공하는 출력 클래스
패키지: org.apache.log4j
Appender 클래스 | 설명 |
AsyncAppender | 비동기 출력 ( 전달자 ) - 로그 이벤트를 queue에 담아 다른 쓰레드(네트워크 등)에서 스케줄로 로그를 출력 - 다른 Appender와 결합하여 사용 |
ConsoleAppender | stdout, stderr 출력 ( Console용 ) |
DailyRollingFileAppender | 지정한 시간 단위로 파일 출력 |
RollingFileAppender | 파일 크기 단위로 파일 출력 |
FileAppender | 파일 출력 |
varia.ExternallyRolledFileAppender | 외부 Rooler로 출력 |
jdbc.JDBCAppender | JDBC를 통해 DB에 출력 |
net.JMSAppender | JMS로 출력 |
lf5.LF5Apperder | LogFactor5 Swing 로그뷰어로 출력 |
nt.NTEventLogAppender | Windows 이벤트 로그로 출력 |
varia.NullAppender | 아무것도 출력 안함 |
net.SMTPAppender | 메일로 출력 |
net.SocketAppender | 외부 서버에 Socket으로 출력 |
net.SocketHubAppender | SocketServer로 출력 |
net.SyslogAppender | Unix Syslog로 출력 |
net.TelnetAppender | 텔넷을 통해 출력 |
Layout
어떤 형식으로 출력할지 정하는 클래스
패키지: org.apache.log4j
Layout 클래스 | 설명 |
SimpleLayout | 기본 레이아웃 |
TTCCLayout | 시간 출력에 특화된 레이아웃 |
HTMLLayout | HTML 형식으로 출력(테이블 형식으로 각각의 로그를 출력) |
XMLLayout | XML 형식으로 출력 |
PaternLayout | 사용자 마음대로 패턴을 지정하여 출력 |
Layout 옵션
PatternLayout 클래스를 사용할 시 사용
Layout 클래스 | 설명 |
%t | 로깅 이벤트를 생성한 쓰레드 이름 |
%d | 로깅 이벤트가 일어난 일자 |
%p | 로깅 이벤트의 우선순위 |
%c | 로깅 이벤트의 category |
%F | 로깅 요청을 일으킨 파일 이름 |
%L | 로깅 요청을 일으킨 파일의 행 번호 |
%x | NDC(Nestted Diagnostic Context) 출력 |
%C | 로깅 요청을 일으킨 호출자의 완전한 클래스 이름 |
%M | 로깅 요청을 일으킨 메소드 |
%m | 메세지 |
%n | 플랫폼의 독립적인 개행문자 |
%l | 소스코드 위치 정보 출력 |
4. 로그 설정
설정 파일은 "log4j.properties"이다.
LogManager는 CLASSPATH 또는 프로젝트 root 디렉토리에 지정해야 "log4j.properties"를 읽을 수있다.
Level, Appender, Layout등을 설정한다.
# log4j.properties 파일
# 대부분 로그파일은 어떤 프로그램에서 사용하는 환경변수에 맞춰 경로를 지정한다.
# 그래서 미리 경로를 지정해주어 사용한다.
log = ${user.home}/log
###################### Logger ###############################
# rootLogger(최상위 로거)를 통해 로그레벨로 "DEBUG"를 지정.
# 최상위 로그 이름 "FILE1", "FILE2"로 지정.(다수 가능)
log4j.rootLoger = DEBUG, FILE1, FILE2
# 하위 로거 지정
log4j.logger.name.of.the.package.one=INFO console
# 로그 이름 따라 로그레벨을 따로 지정 가능
log4j.appender.console.Threshold = INFO
###################### Appender ##############################
# Appender 지정
## Appender 클래스 지정
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
## 출력 파일지정(대부분 절대경로 지정)
log4j.appender.FILE.File=output.log
## 날짜 패턴 추가
log4j.appender.FILE.DatePattern='.'yyyyMMDD
## WAS 재시작시 로그파일 새로 생성 여부(true: 기존파일에 추가, false: 파일 새로 생성)
log4j.appender.FILE.Append=true
## 최대크기
log4j.appender.FILE.MaxFileSize=1KB
## 파일크기 초과시 백업
log4j.appender.FILE.MaxBackupIndex=1
## Console용 클래스 지정
log4j.appender.console=org.apache.log4j.ConsoleAppender
###################### Layout ##############################
# Layout 지정
## FILE1 Layout 클래스 지정
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
## Layout 패턴 지정
log4j.appdender.FILE.ConversionPattern=[%d{HH:MM:ss}] [%-5p] (%F: %L) -%m%n
## console Layout 클래스 지정
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
## Layout 패턴 지정
log4j.appdender.FILE.ConversionPattern=%-5p%l -%m%n
'Java' 카테고리의 다른 글
[자바] log4j 자바소스로 구현 (0) | 2021.09.15 |
---|---|
[자바] 배포 설명자 web.xml 및 태그 (0) | 2021.07.24 |
[자바] I/O(입출력) Stream이란? (0) | 2021.06.05 |
[자바] 문자열 클래스 - String / StringBuffer / StringBuilder의 차이점 (0) | 2021.05.22 |
[자바] 전달인자(Argument)와 매개변수(Parameter)의 차이점 (0) | 2020.04.01 |