로깅프레임워크

자바 로깅 프레임워크 (log4j, logback, slf4j)

@ Log4j

  • log4j는 로깅을 수행하는 로깅 구현체다.

1. 주요 기능 및 특징

  • 속도에 최적화되었다.

  • 멀티 스레드 환경에 안전하다.

  • 계층적 로그 설정 및 처리할 수 있다.

    6가지의 계층적 로그 레벨

  • 파일, 콘솔, 원격 서버, 이메일 등 다양한 형태로 로그를 기록할 수 있다.

    단, 로그에 대한 파일 입출력시 오버헤드가 발생 할 수 있다.

  • 개발 중간에 로그 설정을 변경하면, 서버를 재시작해야한다.

2. 주요 구조

  • Appender : 파일, 콘솔, 원격 서버 등 로그를 기록할 위치를 지정한다.

    ConsoleAppender : 콘솔에 로그를 남긴다.

    FileAppender : 파일에 로그를 남긴다.

    RollingFileAppender : 로그의 크기가 일정 용량이 되면 다른 파일에 남긴다.

    DailyRollingFileAppender : 하루 단위로 파일에 로그를 남긴다.

    SMTPAppender : 이메일에 로그를 남긴다.

  • Layout : 기록할 로그의 패턴을 지정한다.

  • Logger : 로깅일 일어나는 부분을 그룹화하여, 필요한 그룹의 로그만 출력하도록 지정한다.

3. 로그 레벨

  • FATAL < ERROR < WARN < INFO < DEBURG < TRACE 순으로 6가지의 레벨이 있다.

  • 좌측으로 갈수록 좁은 범위의 크리티컬한 로그 레벨을 의미하고, 우측으로 갈수록 넓은 범위를 로그 레벨을 의미한다.

    DEBURG로 설정하는 경우, FATAL / ERROR / WARN / INFO / DEBURG 레벨의 로그들을 기록한다.



@Logback

  • log4j와 마찬가지로 로깅을 수행하는 로깅 구현체다.
  • logback은 log4j 개발자가 기존의 log4j를 대체하기 위해 개발한 로깅 프레임워크다.
  • log4j를 토대로 만들어서 더 높은 성능과 안정성을 보장할 수 있다.

1. 주요 기능 및 특징

  • log4j보다 로그를 기록하는 속도가 빠르며 메모리 효율도 좋다.

  • 이외에도 다양한 형태로 로그를 남기고, 계층적인 로그 레벨을 가진다.

    log4j와 달리 5가지의 로그 레벨을 가짐.

  • 개발 도중에도 로그 설정을 변경해도 서버를 재시작 하지 않아도 된다.

  • 서버 중지 없이 I/O 실패에도 복구할 수 있다. (이건 뭔말인지 아직 잘 모르겠음)

2. 주요 구조

  • Appender와 Logger는 동일한데 Layout의 역할을 Encoder로 지정한다.

  • 즉, logback의 주요 구조는 Appender / Encoder / Logger 등 이 있다.

3. 로그레벨

  • 로그 레벨은 FATAL을 제외하고, ERROR < WARN < DEBURG < TRACE로 5단계의 레벨이 있다.

※ logback을 사용하기 위해서는 slf4j를 함께 사용해야한다.?

  • logback을 만들면서 함께 slf4j를 만들었다고 하며, logback을 쓰기 위해서는 같이 써야한다고 한다. 하지만 slf4j는 따로 log4j나 다른 로깅 구현체들과 사용할 수도 있다.



@Slf4j

  • logback이나 log4j 등의 로깅 구현체 프레임워크들을 사용하는데 통일화된 인터페이스로 구현할 수 있도록 해주는 프레임워크다.

  • 즉, 앞서 말한 logback이나 log4j는 로깅 구현체이고, 이들을 통일화된 방식으로 구현할 수 있도록 도와주는 것이 slf4j다.

  • 따라서, 구현체의 종류에 상관없이 일관된 로깅 코드로 로깅 구현체를 구현해놓으면, 이후에 변경하거나 추가하여도 로깅 구현 코드에는 수정이 필요없다.

slf4j와 관련된 간단한 라이브러리 소개

  • slf4j-api.jar : 다양한 로깅 구현체를 통일화된 인터페이스로 구현할 수 있게 api를 제공하는 라이브러리

  • logback-core.jar : 말그대로 logback 핵심 라이브러리

  • logback-classic.jar : slf4j와 logback을 바인딩해주는 라이브러리

    부가 설명 하자면, slf4j가 logback에게 로깅 처리를 호출해준다.

    logback-core와 slf4j-api 디펜던시도 모두 가지고 있긴함.

  • slf4j-log4j12.jar : log4j와 slf4j를 바인딩해주는 라이브러리

    마찬자기로, slf4j가 logback에게 로깅 처리를 호출해준다.

  • log4j-over-sl4f.jar : log4j의 로깅을 slf4j로 연결해주는 역할을 하는 라이브러리

    기존의 프로젝트나 의존하는 외부 라이브러리에서 log4j 로깅을 직접 사용하고 있었다면, 이를 slf4j-api로 라우트 해주는 역할을 한다.

    따라서, 외부 라이브러리와 같이 수정할 수 없는 부분에서 직접적으로 사용되는 log4j의 로깅을 slf4j-api로 라우트하여 실제로는 logback으로 로깅되게 해주는거다.

  • log4j-over-slf4j.jar 이외에도 jcl-over-slf4j.jar 등이 있다.


정리

  • 대표적인 로깅 구현체는 log4j와 logback이 있다.

  • slf4j는 실제 로깅을 수행하는 구현체가 아니며, 다양한 로깅 구현체들을 통일된 인터페이스로 구현할 수 있도록 도와주는 중간역할이다.

  • slf4j를 통해 실제 사용할 로깅 구현체에 바인딩하는 라이브러리들로는 다음과 같다.

  • 기존의 로깅 구현체 / 인터페이스를 slf4j로 라우트하여 연결된 하나의 로깅 구현체로 처리하기 위한 라이브러리는 다음과 같다.

    • jcl은 뭐냐… jcl은 흔히 알고 있는 (자카르타)commons-logging 를 말하며, slf4j 처럼 실제 로깅 처리를 하는 구현체가 아닌 인터페이스 역할을 하던 라이브러리를 말한다.

    • 대표적으로 스프링의 경우 자체적으로 jcl을 이용하고 있기때문에, 이를 slf4j로 라우트하기 위해서 jcl-over-slf4j 라이브러리를 사용해야한다.

댓글