📘 Logging이란?
로그(log)는 두가지 의미를 갖는다.
- 사전적 의미 : 통나무, 향해 일지, 배의 속력이나 항주한 거리를 계측하는 장치의 총칭
- 실질적 의미 : 기록을 남기는 것
📜 로그를 사용하는 이유
- 애플리케이션을 운영할 때 로그의 효율적인 관리가 가능하다. (콘솔 또는 특정 파일)
- 콘솔 로그를 위해서 System.out.print를 사용하는 것은 성능 저하를 야기한다.
pom.xml에 자동으로 slf4j 라이브러리가 추가되어 있다.
📜 로그의 장단점
✏ 장점
- 프로그램의 문제 파악에 용이하다.
- 빠르고 효율적인 디버깅이 가능하다.
- 수행내역 파악이 쉽다.
- 로그 이력을 파일, DB 등으로 남길 수 있다.
✏ 단점
- 로그에 대한 디바이스(파일) 입출력으로 인해 런타임 오버헤드가 발생한다.
- 로깅을 위한 추가 코드로 인해서 전체 코드 사이즈가 증가한다.
- 심하게 생성되는 로그는 혼란을 야기하거나 애플리케이션 성능에 영향을 미친다.
- 개발 중간에 로깅 코드를 추가하기 어렵다.
📜 Logging Framework (log4j / logback / slf4j)
- 스프링 프로젝트에는 기본적으로 log4j 라이브러리가 추가되어있고 log4j와 관련된 설정을 담은 log4j.xml 파일을 서버 구동과 동시에 로딩하게 되어 있다.
✅ 하지만 log4j를 이용하여 많은 양의 로그를 출력하는 경우에 성능 저하가 심해져서 최근에는 logback 이라는 라이브러리를 사용한다. (10배 빠른 속도)
- 스프링 프로젝트에서 기존에 사용하던 log4j를 새로운 logback으로 변경해야 하는데 이를 일일이 변경하기엔 비효율적이므로
log4j < - > logback 으로 서로 변환해줄 수 있는 slf4j 라이브러리가 존재한다.
(STS 사용 시 pom.xml에 자동으로 slf4j 라이브러리가 추가되어 있다.
⏩ pom.xml에 <!- Logging 부분
- slf4j(Simple Logging Facade for Java)란 Facade(추상체) 역할을 하며, Logging Framework간 호환성을 보장하는 역할을 한다.
📜 log4j.xml (로그 관련 설정 파일) 구조
- Appender : 전달된 로그를 어디에 출력할지 결정 (콘솔 출력, 파일 기록, DB 저장)
- Logger / root : 출력할 메세지를 Appender에 전달한다. (로그 주체)
# name 속성 : 로그 주체, 패키지 작성
# addtivilty 속성 : 로그가 상위로 전달할 지 여부, 기본 값은 true
# appender-ref 자식태그 : ref 속성 값으로 appender 태그 name 값을 지정한다.
# level 자식태그 : 로그레벨을 설정한다. 설정된 값 이상의 priority일 경우, 로깅을 출력한다.
(DEBUF < INFO < WARN < ERROR < FATAL)
📜 Appender의 종류
- ConsoleAppender : 로그를 콘솔에 출력하기 위한 Appender
- JDBCAppender : 로그를 RDB에 출력하기 위한 Appender
- FileAppender : 로그를 파일에 출력하기 위한 Appender
- RollingFileAppender : FileAppender를 보완한 개념 (일정한 조건 후에 기존 파일을 백업 파일로 바꾸고 다시 처음부터 로깅 시작)
📜 Layout