[Java] 새 프로젝트에서 log4j 대신 logback을 사용해야합니까?


Answers

Logback 및 Log4j 작성자는 http://logback.qos.ch/reasonsToSwitch.html 에서 변경해야하는 이유 목록을 제공합니다.

저에게 밖으로 찔린 약간은 여기있다;

  • 신속한 구현

    log4j에 대한 이전 연구 결과를 토대로, 특정 중요 실행 경로에서 약 10 배 더 빠르게 수행되도록 로그백 내부가 다시 작성되었습니다. 로그백 구성 요소가 빠를뿐만 아니라 메모리 사용 공간도 작습니다.

  • 구성 파일의 자동 재로드

    Logback-classic은 수정시 구성 파일을 자동으로 다시로드 할 수 있습니다. 스캔 프로세스는 스캔을위한 별도의 스레드 생성을 필요로하지 않으므로 빠르고 안전합니다. 이 기술적 인 미묘 함은 응용 프로그램 서버 내에서 그리고 일반적으로 JEE 환경 내에서 로그백이 원활하게 작동하도록 보장합니다.

  • 패키징 데이터로 트레이스를 스택

    logback이 예외를 출력 할 때 스택 추적은 패키징 데이터를 포함합니다. 다음은 logback-demo 웹 애플리케이션에 의해 생성 된 샘플 스택 추적입니다.

    14 : 28 : 48.835 [btpool0-7] INFO cqldemo.prime.PrimeAction - 99가 유효한 값이 아닙니다. java.lang.Exception : 99가 잘못되었습니다.
    org.apache.struts.action.RequestProcessor.processActionPerform (RequestProcessor.java:431)에서 ch.qos.logback.demo.prime.PrimeAction.execute (PrimeAction.java:28) [classes / : na] [struts-1.2 .9.jar : 1.2.9] org.apache.struts.action.RequestProcessor.process (RequestProcessor.java:236) [struts-1.2.9.jar : 1.2.9] at org.apache.struts.action. HttpServlet.service (HttpServlet.java : 820)의 ActionServlet.doPost (ActionServlet.java:432) [struts-1.2.9.jar : 1.2.9] [servlet-api-2.5-6.1.12] .jar : 6.1.12]
    org.mortbay.jetty.servlet.ServletHolder.handle (ServletHolder.java:502) [jetty-6.1.12.jar : 6.1.12] ch.qos.logback.demo.UserServletFilter.doFilter (UserServletFilter.java:44) ) [classes / : na] org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1115) [jetty-6.1.12.jar : 6.1.12] at org.mortbay.jetty.servlet. ServletHandler.handle (ServletHandler.java:361) [jetty-6.1.12.jar : 6.1.12] at org.mortbay.jetty.webapp.WebAppContext.handle (WebAppContext.java:417) [jetty-6.1.12.jar : 6.1.12] at org.mortbay.jetty.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:230) [jetty-6.1.12.jar : 6.1.12]

    위에서 보았 듯이, 애플리케이션이 Struts 버전 1.2.9를 사용하고 있으며 부두 버전 6.1.12로 배포되었음을 알 수 있습니다. 따라서 스택 트레이스는 독자가 예외 상황에서 반전 된 클래스뿐만 아니라 자신이 속한 패키지 및 패키지 버전을 신속하게 알려줍니다. 고객이 스택 추적을 보내면 개발자는 더 이상 사용중인 패키지 버전에 대한 정보를 요청할 필요가 없습니다. 정보는 스택 추적의 일부가됩니다. 자세한 내용은 "% xThrowable"변환 단어를 참조하십시오.

    이 기능은 일부 사용자가 실수로 IDE의 기능이라고 생각하는 지점에 매우 유용 할 수 있습니다.

  • 이전 로그 아카이브 자동 제거

    TimeBasedRollingPolicy 또는 SizeAndTimeBasedFNATP의 maxHistory 특성을 설정하여 아카이브 된 파일의 최대 수를 제어 할 수 있습니다. 롤링 정책에서 월간 롤오버를 호출하고 1 년 동안의 로그를 유지하려면 maxHistory 속성을 12로 설정하기 만하면됩니다. 12 개월보다 오래된 아카이브 로그 파일은 자동으로 제거됩니다.

거기에 편향이있을 수 있지만, 같은 사람이 두 프레임 워크를 작성했는데 Log4j를 통해 Logback을 사용한다고 말하면 아마도 듣기에 충분할 것입니다.

Question

새 프로젝트에서 log4j 대신 logback을 로깅 프레임 워크로 사용해야합니까?

또는 다른 말로하면 : 'log4j보다 로그백이 더 낫습니다 (SLF4J를'로그백 '기능으로 남겨 두었습니까?)?




나는 당신이 log4j 또는 Jakarta Commons Logging을 사용하기로 결정할 때와 동일한 결정을 내려야한다고 생각할 것입니다. 다른 응용 프로그램에 포함될 라이브러리를 개발하고 있습니까? 그렇다면 라이브러리 사용자가 선택한 로깅 라이브러리를 사용하도록하는 것이 공정하지 않은 것 같습니다.

대답이 '아니요'인 경우 추가하기가 더 쉽고 편하고 편한 점이 있습니다. 로그백과 같은 사운드는 log4j만큼 확장 가능하고 신뢰할 수 있습니다. 사용하는 것이 편한 경우 계속하십시오.




Logback more Java EE aware :
일반적으로 (코드에서부터 문서에 이르기까지) 컨테 이너 컨테이너 (여러 애플리케이션이 공존하는 방식, 클래스 로더 구현 방법 등)를 유지합니다. 로거, JNDI, JMX 구성 등의 컨텍스트가 포함됩니다.

logback은 매개 변수화 된 로깅을 추가합니다 (logger.isDebugEnabled ())를 사용할 필요가 없으므로 문자열 연결 오버 헤드를 피할 수 있습니다.

Log4j - 거대한 플러스 만 오래된 JVM 지원, 작은 (IMO) NDC (Logback 전용 MDC), 일부 확장 기능입니다. 예를 들어, Log4j에 대한 configureAndWatch의 확장 기능을 썼습니다.