코딩마을방범대
로깅(Logging)이란? 본문
Log - (1) Log4j
Log - (2) Logback
Log - (3) Log4jdbc+Logback을 이용한 SQL 로그 남기기
Log - (4) log 설정 xml 파일에서 if문 사용하기
로깅(Logging)
정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동
로그(Log)의 이점
1. 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있음
2. 성능에 관한 통계와 정보를 제공할 수 있음
로그를 출력하는 방법
- System.out.println() 이용
- 로깅 라이브러리 이용
로그 라이브러리 종류
java.util.logging
- JDK 1.4부터 포함된 표준 로깅 API
- 별도 라이브러리 추가 불필요
- 기능이 많이 부족해 다른 로그 라이브러리를 많이 사용
Apache Commons logging
- 아파치 재단의 Commons 라이브러리 중에 로그 출력을 제공하는 라이브러리
Log4j
- 아파치 제단에서 제공하며 가장 많이 사용되는 로깅 라이브러리
Logback
- Log4j를 개발한 Ceki Gulcu가 Log4j의 단점 개선 및 기능을 추가하여 개발한 로깅 라이브러리
로그 구조
Core Layer
로그 구조 | 설명 |
Logger | 가장 상위계층으로 로깅 정보를 받는 계층 로그 레벨을 결정 |
Layout | 출력되는 문자열 스타일을 포맷하는 계층 어떻게 기록할지를 결정 |
Appender | 여러 장치로 내보내는 계층 출력 위치를 결정(파일, 콘솔, DB 등) |
Support Layer
로그 구조 | 설명 |
Level | 로깅 수준을 결정 |
Filter | 로깅 여부를 Appender에 제공하는 역할 |
ObjectRender | 객체를 문자열로 바꾸어 Layout에 제공하는 역할 |
LogManager | 설정 파일에서 로깅 프레임워크를 관리하는 역할 |
(1) Level
로그 표기의 범위를 지정
로그 레벨 | 특징 | 기준 |
FATAL (100) | 치명적인 문제를 기록하며, 시스템이 계속 동작할 수 없음을 나타냄 | 시스템 종료나 중대한 오류로 인해 서비스가 중단되는 경우에 사용 (주요 구성 요소의 실패 등) |
ERROR (200) | 심각한 문제를 기록하며, 시스템의 일부 기능이 실패했음을 나타냄 (=default) | 오류가 발생했을 때 기록 (예외 처리 실패나 데이터베이스 연결 실패 등) |
WARN (300) | 경고 메시지를 기록하며, 즉시 해결이 필요하지 않지만 잠재적인 문제를 나타냄 | 시스템의 성능에 영향을 미치지 않는 오류나 예외 상황을 기록 (API 호출 실패나 리소스 부족 등) |
INFO (400) | 시스템의 일반적인 운영 정보를 기록함 주로 중요한 사건이나 시스템의 상태 변화를 나타냄 |
운영 환경에서 자주 사용되며, 시스템의 정상적인 동작을 나타내는 정보를 기록 (서비스 시작/종료, 설정 변경 등) |
DEBUG (500) | 개발 및 디버깅 목적으로 사용되며, 시스템의 내부 상태와 변수 값을 기록 | 개발 중 문제를 찾기 위해 사용되며, 운영 환경에서는 보통 비활성화됨. 특정 문제 해결을 위해 필요한 경우에만 활성화 |
TRACE (600) | 가장 상세한 로그 레벨로, 코드의 흐름과 매우 자세한 정보를 기록 | 디버깅을 위해 주로 사용되며, 거의 모든 동작을 기록 성능에 영향을 줄 수 있기 때문에 운영 환경에서는 거의 사용하지 않음 |
레벨의 우선 순위
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
예) 출력레벨이 INFO인 경우 INFO, WARN, ERROR, FATAL이 출력됨
로그 레벨의 사용 사례
로그 레벨 | 사례 |
FATAL | 시스템 크래시, 주요 서비스 종료 등 치명적인 문제를 기록할 때 |
ERROR | 예외 발생, 외부 시스템 호출 실패 등 오류 상황을 기록할 때 |
WARN | 디스크 공간 부족, 비정상적인 사용자 입력 등 주의가 필요한 상황을 기록할 때 |
INFO | 사용자 로그인, 데이터베이스 연결, 서비스 시작/중지 등 중요한 운영 이벤트를 기록할 때 |
DEBUG | 시스템의 내부 상태, 특정 동작의 결과 등을 기록하여 문제를 디버깅할 때 |
TRACE | 메서드 호출, 루프 내부 상태, 변수 값 등 매우 상세한 정보를 원할 때 |
(2) Logger
- 실제 로그 기능을 수행하는 객체
- 로그 레벨을 설정할 수 있고, 0개 이상의 Appender를 지정할 수 있음
- 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달됨
요소 | 설명 |
jdbc.sqlonly | SQL문만을 로그로 남기며, PreparedStatement일 경우 관련된 argument 값으로 대체된 SQL문이 보여짐 |
jdbc.sqltiming | SQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함 |
jdbc.audit | ResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로 특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음 |
jdbc.resultset | ResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성 |
Logger 예시
Logger Name | LEVEL | Appender | Additivity |
Root | DEBUG | Console | |
Vehicle | INFO | RollingFile | true |
Vehicle.Car | ERROR | Filer | false |
Additivity : 상위 Logger로부터의 상속 여부
True(기본값) 모든 상위 로거들의 설정값을 상속받아 현재 로거에 설정된 값을 재적용(덮어쓰기) False 상위 로거의 설정 내용을 상속받지 않음
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의 설정 내용으로 동일하게 적용
(3) Appender (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 | 텔넷을 통해 출력 |
(4) Layout
어떤 형식으로 출력할지 정하는 클래스
Layout 클래스 | 설명 |
SimpleLayout | 기본 레이아웃 |
TTCCLayout | 시간 출력에 특화된 레이아웃 |
HTMLLayout | HTML 형식으로 출력(테이블 형식으로 각각의 로그를 출력) |
XMLLayout | XML 형식으로 출력 |
PaternLayout | 사용자 마음대로 패턴을 지정하여 출력 |
Layout 옵션
- 로그를 출력하는 형태를 지정
패턴 | 설명 |
%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 | 쓰레드 이름 출력 |
참고사이트
'🎃 기타 > 상식 ❗' 카테고리의 다른 글
JSON parse의 이스케이프 문자 (0) | 2023.06.05 |
---|---|
노드(node)와 채널(Chennel) (0) | 2023.05.31 |
AOP란 (0) | 2023.05.28 |
웹서버 Nginx & Apache (0) | 2023.05.28 |
프록시(Proxy)란 (0) | 2023.05.28 |