Log - (1) Log4j
Log - (2) Logback
Log - (3) Log4jdbc+Logback을 이용한 SQL 로그 남기기
Log - (4) log 설정 xml 파일에서 if문 사용하기
정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동
로그(Log)의 이점
1. 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있음
2. 성능에 관한 통계와 정보를 제공할 수 있음
System.out.println() 이용
로깅 라이브러리 이용
로그 구조 | 설명 |
---|---|
Logger | 가장 상위계층으로 로깅 정보를 받는 계층 로그 레벨을 결정 |
Layout | 출력되는 문자열 스타일을 포맷하는 계층 어떻게 기록할지를 결정 |
Appender | 여러 장치로 내보내는 계층 출력 위치를 결정(파일, 콘솔, DB 등) |
로그 구조 | 설명 |
---|---|
Level | 로깅 수준을 결정 |
Filter | 로깅 여부를 Appender에 제공하는 역할 |
ObjectRender | 객체를 문자열로 바꾸어 Layout에 제공하는 역할 |
LogManager | 설정 파일에서 로깅 프레임워크를 관리하는 역할 |
로그 표기의 범위를 지정
로그 레벨 | 설명 |
---|---|
FATAL (100) | 아주 심각한 에러가 발생한 상태를 나타냄 |
ERROR (200) | 어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타냄 |
WARN (300) | 프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될수있는 경고성 메시지를 나타냄 |
INFO (400) | 어떠한 상태변경과 같은 정보성 메시지를 나타냄 일반 정보를 나타낼 때 사용 |
DEBUG (500) | 개발시 디버그 용도로 사용하는 메시지를 나타냄 일반 정보를 상세히 나타낼 때 사용 |
TRACE (600) | 디버그 레벨이 너무 광범위한것을 해결하기 위해 좀 더 상세한 이벤트를 나타냄 경로추적을 위해 사용 |
레벨의 우선 순위
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
예) 출력레벨이 INFO인 경우 INFO 이상인 INFO, WARN, ERROR, FATAL이 출력됨
요소 | 설명 |
---|---|
jdbc.sqlonly | SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여짐 |
jdbc.sqltiming | SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함 |
jdbc.audit | ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음 |
jdbc.resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성 |
풀이
- Vehicle의 경우
Root 로거로부터 DEBUG 레벨 설정을 상속받지만 현재 로거에 INFO 레벨이 적용되어 있기 때문에 최종적으로 INFO 레벨이 적용되며, Root 로거의 Console Appender와 Vehicle 로거의 RollingFile Appender 모두에게 로그 메시지를 전달
- Vehicle.Car의 경우
Additivity 값이 false 이기 때문에 상위 로거인 Root, Vehicle 로거로부터 설정을 상속받지 않아 최종적으로 ERROR 레벨 이상의 로그가 File Appender로 전달
Logger 설정되지 않은 클래스명( ex – Vehicle.Airplane)이 입력되었을 경우, 상위 로거인 Vehicle의 설정 내용으로 동일하게 적용
Logger Name | Level | Appender | Additivity |
---|---|---|---|
Root | DEBUG | Console | |
Vehicle | INFO | RollingFile | true |
Vehicle.Car | ERROR | Filer | false |
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 클래스 | 설명 |
---|---|
SimpleLayout | 기본 레이아웃 |
TTCCLayout | 시간 출력에 특화된 레이아웃 |
HTMLLayout | HTML 형식으로 출력(테이블 형식으로 각각의 로그를 출력) |
XMLLayout | XML 형식으로 출력 |
PaternLayout | 사용자 마음대로 패턴을 지정하여 출력 |
패턴 | 설명 |
---|---|
%m | 로그 내용 출력 |
%p | debug, info, warn, error 등의 priority 출력 |
%r | 어플리케이션 시작 후 이벤트가 발생하는 시점까지의 경과시간. (밀리세컨드로 출력) |
%c | package 출력 |
%C | 클래스명 출력 |
%d | 이벤트 발생 날짜 출력 |
%n | 개행문자(\n) 출력 |
%M | 로깅이 발생한 method 이름 출력 |
%F | 로깅이 발생한 프로그램 파일명 출력 |
%l | 로깅이 발생한 caller 정보 출력 |
%L | 로깅이 발생한 caller 라인수 출력 |
%x | 로깅이 발생한 thread와 관련된 NDC 출력 |
%X | 로깅이 발생한 thread와 관련된 MDC 출력 |
% | % 출력 표시 |
%t | 쓰레드 이름 출력 |