spring logback 사용
마이크로 서비스를 개발하면서 로그의 중요성을 다시한번 느끼게 되었다.
ELK 를 사용해서 중앙에 로그를 수집하기 전에 우선 로컬에서 로그를 수집하는 방법부터 알아봤다.
logback
logback 은 자바 오픈소스 로깅 프레임워크로 SLF4J 구현체이자 스프링 부트의 기본 로그 객체이다. 다른 로그들도 존재하지만 가장 많이 사용하는 로그 객체이다.
우선 logback 을 사용허기 위해선 다음과 같은 lib 를 dependency 에 추가한다. compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
* 스프링부트에서는 기본 로그이기 때문에 굳이 위의 dependency를 추가하지 않아도 사용가능하다.
spring-boot-starter-web 안에 spring-boot-starter-logging에 있다.
원래 Logback은 logback-core, logback-classic, logback-access로 구성되어있는데 logback-classic만 받아도 자동으로 내부에서 등록되어 있다.
logback을 이용해서 코드에서 로그를 찍을 때는 아래와 같이 간단하게 사용하면 된다.
logback 사용하기
logback을 이용해서 코드에서 로그를 찍을 때는 아래와 같이 간단하게 사용하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package chapters.introduction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld1 { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1"); logger.trace("Hello world."); logger.debug("Hello world."); //debug level로 해당 메시지의 로그를 찍겠다. logger.info("Hello world."); logger.warn("Hello world."); logger.error("Hello world."); } } |
LoggerFactory에서 로거 객체를 불러온 후, 로거 객체를 이용해서 코드의 원하는 부분에 로그를 찍으면 된다.
사실 logging에서 중요한 부분은 무슨 내용을, 어디에, 어떻게 찍을 건지 관리하는 것이다.
logback은 그 부분을 따로 설정파일을 두어 세팅해놓고 사용은 위에서 본 것처럼 간단하게 사용한다.
위의 방법으로 logback 을 사용해도 되지만 요즘은 어노테이션으로 간단하게 logback 을 사용할 수 있다. lombok 라이브러리에 달려있다.
Slf4j
@Slf4j
public class LogObject {
public void print() {
log.info("hello world");
}
}
public class LogObjectNot {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogObjectNot.class);
}
@Slf4j
public class LogObject {
public void print() {
log.info("hello world");
}
}
public class LogObjectNot {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogObjectNot.class);
}
logback 설정
그렇다면 이런 로그는 대체 어디에 쌓일까 log에 여러가지 기능이 있는데 가령 info error debug 등은 어느 프로파일에서 어떻게 쌓이게 하는것이 좋을까 등을 고민할 수가 있다. 이런 세팅은 설정으로 할 수 있는데스프링이나 일반 자바프로그램의 경우는 보통 logback.xml 파일을 resources 디렉토리에 만들어서 참조한다.그러나 스프링부트에서는 logback-spring.xml 파일을 만들어서 참조한다.logback은 이 설정파일을 자동으로 찾는데 logback.groovy -> logback-test.xml -> logback.xml 순서로 찾고 없으면 디폴트 설정을 따른다.
* 스프링부트의 경우 조금 다르게 logback-spring.xml이라는 이름으로 설정하는데 그 이유는 logback.xml이라는 이름으로 이미 스프링부트가 설정되기 전에 로그백 관련 설정을 해버리기 때문에 logback.xml이라는 이름 대신 logback-spring.xml을 사용한다.
Logback 설정파일은 크게 두 부분으로 나뉜다.
Appender 와 logger
* Appender 종류
ConsoleAppender : 콘솔에 로그를 찍는 방법
FileAppender : 파일에 로그를 찍는 방법
RollingFileAppender : 여러개의 파일을 순회하면서 로그를 찍는 방법
SMTPAppender : 로그를 메일에 찍어 보내는 방법
DBAppender : 데이터베이스에 로그를 찍는 방법
기타 SocketAppender, SSLSocketAppender등이 있다.
* 로그 레벨(Log level)
ERROR < WARN < INFO < DEBUG < TRACE
해당 레벨 이하의 것은 다 찍는다고 했다. 이 말은
INFO 레벨로 지정하면 INFO, WARN, ERROR 로그가 찍히고, WARN 레벨로 지정하면 WARN, ERROR 로그가 찍힌다.
FATAL은 없고 TRACE, DEBUG 레벨로 찍을 경우 로그가 상당히 많이 찍히므로 주의해야한다.
RollingFileAppender의 경우는 설정할 것이 많아 자세히 봐야한다.
여기서는 상관없지만 Rolling이 아닐 경우 <file> 엘리먼트로 어디에 어떤 이름의 파일로 기록할지를 설정해야한다.
그리고 똑같이 encoder안에 pattern을 정의한다.
RollingFile이기 때문에 Rolling 정책을 적어야한다.
<filePattern>으로 순서대로 작성될 파일명을 지정해주고, <maxFileSize>로 한 파일당 최대 크기를 지정한다.
출처: https://jeong-pro.tistory.com/154 [기본기를 쌓는 정아마추어 코딩블로그]
댓글