코딩마을방범대

로깅(Logging)이란? 본문

🎃 기타/상식 ❗

로깅(Logging)이란?

신짱구 5세 2023. 5. 29. 16:46
728x90

 

 

Log - (1) Log4j
Log - (2) Logback
Log - (3) Log4jdbc+Logback을 이용한 SQL 로그 남기기
Log - (4) log 설정 xml 파일에서 if문 사용하기


 

로깅(Logging)

정보를 제공하는 일련의 기록인 로그(log)를 생성하도록 시스템을 작성하는 활동

로그(Log)의 이점
1. 재현하기 힘든 버그에 대한 유용한 정보를 제공할 수 있음
2. 성능에 관한 통계와 정보를 제공할 수 있음

 

로그를 출력하는 방법

  1. System.out.println() 이용
  2. 로깅 라이브러리 이용

 

 


 

 

로그 라이브러리 종류

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 쓰레드 이름 출력





참고사이트

로깅(Logging)이란?

728x90

'🎃 기타 > 상식 ❗' 카테고리의 다른 글

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