티스토리 뷰
2) slf4j 설정하기
SLF4J란?
- logging 관련 라이브러리는 다양하다.
- 이러한 라이브러리들을 하나의 통일된 방식으로 사용할 수 있는 방법을 SLF4J는 제공한다.
- SLF4J는 로깅 Facade이다.
- 로깅에 대한 추상 레이어를 제공하는 것이고 interface의 모음이다.
SLF4J를 이용해 로깅 라이브러리 사용하기
- 녹색의 application들은 하늘색의 SLF4J를 사용하고 있습니다.
- application은 SLF4J를 사용함으로써 로깅 라이브러리로 어떤 것을 사용하던지 같은 방법으로 로그를 남길 수 있게 됩니다.
- 이런 방식의 장점은 나중에 더 좋은 로그 라이브러리가 등장하게 돼서 로그 라이브러리를 교체한다고 하더라도 application의 코드는 변경될 필요가 없습니다.
maven에 SLF4J와 logback의존성 추가하기
- 참고로 logback-classic 1.2.3은 이미 slf4j-api 1.7.25에 대한 의존성을 가지고 있기 때문에 slf-j-api를 추가할 필요는 없다.
- Spring은 기본적으로 아파치 재단의 commons-logging을 사용한다.
- logback라이브러리를 사용하려면 commons-logging을 제거해야한다.
- Spring라이브러리에서 commons-logging을 제거하면, Spring을 사용할 때 commons-logging라이브러리를 찾으면서 오류(ClassNotFoundException)가 발생한다.
- 이러한 오류를 제거하기 위해서 jcl-over-slf4j를 추가한다. 즉 Spring은 commons-logging 대신에 jcl-over-slf4j를 이용해서 로그를 남기게 되는 형식이다.
logback 설정
- SLF4J는 로그를 남기기 위한 공통 인터페이스라서 실제로 로그를 남기는 것은 logback 라이브러리이므로 logback 설정을 해줘야 합니다.
- logback.xml -> logback 설정파일이며 루트요소는 configuration이고 해당 루트요소 안에는 appender, logger, root 등에 대한 설정을 하게 됩니다.
- Appender 설정
- logger 설정
- root 설정
Appender
- 어디에 어떤 포맷으로 로그를 남길 것인지를 정할 수 있는 방법을 제공하는 겁니다. 대표적으로는 ConsoleAppender, FileAppender, RollingFileAppender 등이 있습니다.
- ConsoleAppender : 콘솔에 로그를 어떤 포맷으로 출력할지를 설정할 때 사용한다.
- FileAppender : 파일에 로그를 어떤 포맷으로 출력할지를 설정한다.
- RollingFileAppender : 로그의 양이 많아지면, 하나의 파일로 관리하기 어려워지는 경우가 생긴다. 이런 문제를 해결하기 위해 하루 단위로 로그를 관리하고자 할 경우 사용된다.
ConsoleAppender 설정
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern> </encoder> </appender> |
|
RollingFileAppender 설정
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>access-%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <Pattern>%d{HH:mm} %-5level %logger{36} - %msg%n</Pattern> </encoder> </appender> |
|
Log Level
- trace : debug보다 세분화된 정보
- debug : 디버깅하는데 유용한 세분화된 정보
- info : 진행상황 같은 일반 정보
- warn : 오류는 아니지만 잠재적인 오류 원인이 될 수 있는 경고성 정보
- error : 요청을 처리하는 중 문제가 발생한 오류 정보
로그 레벨 설정과 root 설정
<logger name="org.springframework" level="info"/> <logger name="kr.or.connect" level="debug"/> <root level="debug"> <appender-ref ref="CONSOLE"/> <appender-ref ref="FILE"/> </root> |
|
Logger 객체 선언
- 로그를 남기고자 하는 클래스에 로거 객체를 필드로 선언한다.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ....... private Logger logger = LoggerFactory.getLogger(this.getClass()); |
|
로그 출력 메소드
- 문자열 결합을 위해 '+'연산자를 사용하지 않는다.
스트링을 + 연산자를 이용해서 연결을 하면은 속도가 굉장히 느려집니다. SLF4J의 로그 출력 메서드의 첫 번째 인자로는 출력할 로그 문자열을 넣게 되고 두 번째부터는 가변 인자를 받습니다.(가변 인자란 0개 이상의 인자를 전달할 수 있다는 것을 의미합니다) - 로그로 남길 변수의 수만큼 {} 를 이용한다.
문자열의 변수를 출력하고 싶다면 변수를 출력할 위치에 중괄호를 열고 닫고 넣습니다. 중괄호 열고 닫고의 수만큼 로그의 문자열 뒤에 가변 인자로 넘겨주게 됩니다. - 로그의 수준에 따라 debug(), info(), warn(), error()메소드를 이용한다.
logger.trace("{} {} 출력", "값1", "값2"); logger.debug("{} {} 출력", "값1", "값2"); logger.info("{} {} 출력", "값1", "값2"); logger.warn("{} {} 출력", "값1", "값2"); logger.error("{} {} 출력", "값1", "값2"); |
생각해보기
- 개발하는 컴퓨터에서 웹 어플리케이션을 실행할 때와 운영환경에서 웹 어플리케이션을 실행할 때 로그를 남기는 방법이 다릅니다. 개발할 때는 콘솔에 로그를 출력하는 것이 편하지만 실제 운영을 할 경우에는 파일로 로그릴 기록하는 것이 좋습니다. 이렇게 환경에 따라서 다른 설정파일을 사용하는 경우가 종종 있습니다. 이런 경우 설정파일을 어떻게 관리하는 것이 좋을까요?
paradise**** 2018.08.19
감사합니다.
-------------------------------------------------------------
생각하기에 대한 이야기를 드리면, 용도에 따라 폴더별로 나누어서 관리합니다.
용도에 따른 분류 기준은 찾으시면 나오겠지만 간단하게 이야기 드리면 다음과 같습니다.
local(개인개발), dev(공통개발), stage(운영과 동일한 테스트 환경), production(운영)
참고 자료
[참고링크] Logback Project
[참고링크] How to use logback
https://github.com/sonegy/how-to-use-logback
'부스트코스 웹 프로그래밍 > 6. 웹 앱 개발: 예약서비스 4' 카테고리의 다른 글
3. 파일 업로드 & 다운로드 - BE (1) (0) | 2019.08.13 |
---|---|
2. 로깅 - BE (3) (0) | 2019.08.13 |
2. 로깅 - BE (1) (0) | 2019.08.13 |
1. 파일 업로드 - FE (2) (0) | 2019.08.13 |
1. 파일 업로드 - FE (1) (0) | 2019.08.13 |