로깅(Logging)이란?

단비·2023년 5월 24일
0

학습

목록 보기
66/66

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

로그 표기의 범위를 지정

  • default 레벨은 ERROR
로그 레벨설명
FATAL (100)아주 심각한 에러가 발생한 상태를 나타냄
ERROR (200)어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타냄
WARN (300)프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될수있는 경고성 메시지를 나타냄
INFO (400)어떠한 상태변경과 같은 정보성 메시지를 나타냄
일반 정보를 나타낼 때 사용
DEBUG (500)개발시 디버그 용도로 사용하는 메시지를 나타냄
일반 정보를 상세히 나타낼 때 사용
TRACE (600)디버그 레벨이 너무 광범위한것을 해결하기 위해 좀 더 상세한 이벤트를 나타냄
경로추적을 위해 사용

레벨의 우선 순위
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
예) 출력레벨이 INFO인 경우 INFO 이상인 INFO, WARN, ERROR, FATAL이 출력됨




(2) Logger

  • 실제 로그 기능을 수행하는 객체
  • 로그 레벨을 설정할 수 있고, 0개 이상의 Appender를 지정할 수 있음
  • 입력받은 로깅 메시지는 로그 레벨에 따라 Appender로 전달됨
요소설명
jdbc.sqlonlySQL문만을 로그로 남기며, PreparedStatement일 경우
관련된 argument 값으로 대체된 SQL문이 보여짐
jdbc.sqltimingSQL문과 해당 SQL을 실행시키는데 수행된 시간 정보(milliseconds)를 포함
jdbc.auditResultSet을 제외한 모든 JDBC 호출 정보를 로그로 남긴다. 많은 양의 로그가 생성되므로
특별히 JDBC 문제를 추적해야 할 필요가 있는 경우를 제외하고는 사용을 권장하지 않음
jdbc.resultsetResultSet을 포함한 모든 JDBC 호출 정보를 로그로 남기므로 매우 방대한 양의 로그가 생성

Logger 예시

  • 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의 설정 내용으로 동일하게 적용

Logger NameLevelAppenderAdditivity
RootDEBUGConsole
VehicleINFORollingFiletrue
Vehicle.CarERRORFilerfalse




(3) Appender (Log4j 기준)

Appender 클래스설명
AsyncAppender비동기 출력 ( 전달자 )
- 로그 이벤트를 queue에 담아 다른 쓰레드(네트워크 등)에서 스케줄로 로그를 출력
- 다른 Appender와 결합하여 사용
ConsoleAppenderstdout, stderr 출력 ( Console용 )
DailyRollingFileAppender지정한 시간 단위로 파일 출력
RollingFileAppender파일 크기 단위로 파일 출력
FileAppender파일 출력
varia.ExternallyRolledFileAppender외부 Rooler로 출력
jdbc.JDBCAppenderJDBC를 통해 DB에 출력
net.JMSAppenderJMS로 출력
lf5.LF5ApperderLogFactor5 Swing 로그뷰어로 출력
nt.NTEventLogAppenderWindows 이벤트 로그로 출력
varia.NullAppender아무것도 출력 안함
net.SMTPAppender메일로 출력
net.SocketAppender외부 서버에 Socket으로 출력
net.SocketHubAppenderSocketServer로 출력
net.SyslogAppenderUnix Syslog로 출력
net.TelnetAppender텔넷을 통해 출력




(4) Layout

어떤 형식으로 출력할지 정하는 클래스

Layout 클래스설명
SimpleLayout기본 레이아웃
TTCCLayout시간 출력에 특화된 레이아웃
HTMLLayoutHTML 형식으로 출력(테이블 형식으로 각각의 로그를 출력)
XMLLayoutXML 형식으로 출력
PaternLayout사용자 마음대로 패턴을 지정하여 출력

Layout 옵션

  • 로그를 출력하는 형태를 지정
패턴설명
%m로그 내용 출력
%pdebug, info, warn, error 등의 priority 출력
%r어플리케이션 시작 후 이벤트가 발생하는 시점까지의 경과시간. (밀리세컨드로 출력)
%cpackage 출력
%C클래스명 출력
%d이벤트 발생 날짜 출력
%n개행문자(\n) 출력
%M로깅이 발생한 method 이름 출력
%F로깅이 발생한 프로그램 파일명 출력
%l로깅이 발생한 caller 정보 출력
%L로깅이 발생한 caller 라인수 출력
%x로깅이 발생한 thread와 관련된 NDC 출력
%X로깅이 발생한 thread와 관련된 MDC 출력
%% 출력 표시
%t쓰레드 이름 출력





참고사이트

로깅(Logging)이란?

profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글