log4j2와 함께 slf4j를 사용할 가치가 있습니까?


114

slf4j를 log4j2와 함께 사용할지 여부를 결정할 수 없습니다. 온라인 게시물에 따르면 성능 저하가없는 것처럼 보이지만 실제로는 필요합니다.

또한 다음 포인트는 log4j2를 선호합니다.

  • SLF4J는 애플리케이션이 문자열을 기록하도록합니다. Log4j 2 API는 텍스트를 로깅하려는 경우 모든 CharSequence 로깅을 지원하지만 모든 개체를있는 그대로 로깅하는 것도 지원합니다.
  • Log4j 2 API는 메시지 개체 로깅, Java 8 람다 식 및 가비지없는 로깅을 지원합니다 (vararg 배열 생성을 방지하고 CharSequence 개체 로깅시 문자열 생성 방지).

2
아마도. 내 애플리케이션 서버에 slf4j및 로그 백 (또는 log4jv1)이 포함 된 경우 어떻게 됩니까? 그런 다음 응용 프로그램을 사용하려면 세 번째 로거를 설치해야합니까? 아니면 기업 보안 java.util.logging이 프로덕션 에서만 사용할 수 있다고 결정할 수도 있습니다 .
Elliott Frisch

글을 써 주셔서 감사합니다. 그러나 모든 사람이 log4j 조직 전체를 사용하는 경우 위의 인수는 유효하지 않습니다.
Andy897

4
SLF4J를 사용하면 회사 정책이 변경된 경우 (예 : 회사 인수 및 새 정책 강제 적용) 구현 교체가 매우 쉽습니다. 지금 SLF4J를 사용하면 코드를 작성할 때 Log4j를 직접 사용하는 것보다 시간이 더 걸리지 않습니다. 나중에 직접 Log4j 호출을 바꾸려면 많은 시간이 걸립니다. SLF4J는 미래를위한 무료 투자 / 보험입니다. 이것이 Log4j 2 API 기능보다 더 중요합니까? 귀하 (또는 회사 정책)만이 결정할 수 있습니다.
Andreas

원한다면 log4j2와 함께 slf4j를 사용하는 방법이 있습니까? 이 페이지는 log4j-버전 1.2-수명 종료)의 사용법을 보여 주지만 log4j2에 대한 옵션은 없습니다. 방법이 있다면 왜 slf4j가 그것을 언급하지 않습니까?
J Woodchuck

답변:


162

계속하십시오 : slf4j 대신 log4j2 API로 프로그램하십시오.

안전합니다 : Log4j2 API는 slf4j와 똑같은 보증을 제공합니다.

이제 Log4j2 자체가 API와 구현 모듈로 분리되었으므로 SLF4J를 사용하는 데 더 이상 가치가 없습니다.

예, 옵션을 열어 두는 것이 좋은 엔지니어링 관행입니다. 나중에 다른 로깅 구현으로 변경할 수 있습니다.

지난 10 년 동안 애플리케이션에서 이러한 유연성을 구축하려면 SLF4J와 같은 래퍼 API를 사용해야했습니다. 하지만 이러한 유연성은 무료로 제공되지 않습니다.이 접근 방식의 단점은 애플리케이션이 기본 로깅 라이브러리의 더 풍부한 기능 세트를 사용할 수 없다는 것입니다.

Log4j2는 애플리케이션이 최소 공통 분모로 제한 될 필요가없는 솔루션을 제공합니다.

탈출 밸브 : log4j-to-slf4j

Log4j2에는 log4j-to-slf4j브리지 모듈이 포함됩니다 . Log4j2 API에 대해 코딩 된 모든 애플리케이션은 언제든지 지원 구현을 slf4j 호환 구현으로 전환하도록 선택할 수 있습니다.

log4j-to-slf4j

질문에서 언급했듯이 Log4j2 API를 사용하면 더 많은 기능을 직접 제공하고 slf4j와 같은 래퍼 API를 사용하는 것에 비해 비 기능적 이점이 있습니다.

  • 메시지 API
  • 지연 로깅을위한 Lambda
  • 문자열 대신 모든 개체 기록
  • 가비지 프리 : 가능한 경우 varargs를 생성하거나 String을 생성하지 마십시오.
  • CloseableThreadContext는 항목 사용이 끝나면 MDC에서 항목을 자동으로 제거합니다.

( SLF4J에서 사용할 수없는 10 개의 Log4j2 API 기능 참조 에서 을 참조하십시오.)

애플리케이션은 기본 Log4j2 코어 구현에 고정되지 않고도 Log4j2 API의 이러한 풍부한 기능을 안전하게 사용할 수 있습니다.

SLF4J는 여전히 안전 밸브이며, 애플리케이션이 더 이상 SLF4J API에 대해 코딩해야한다는 의미는 아닙니다.


공개 : Log4j2에 기여합니다.


업데이트 : Log4j2 API에 대한 프로그래밍이 "파사드를위한 외관"을 도입하는 데 약간의 혼란이있는 것 같습니다. 이 점에서 Log4j2 API와 SLF4J 사이에는 차이가 없습니다.

두 API 모두 네이티브 구현을 사용하는 경우 2 개의 종속성이 필요하고 네이티브가 아닌 구현의 경우 4 개의 종속성이 필요합니다. SLF4J와 Log4j2 API는이 점에서 동일합니다. 예를 들면 :

SLF4J 및 Log4j 2 API의 필수 종속성은 유사합니다.


7
이해 했어요. 내 질문을 다시 말하겠습니다. log4j2 이외의 log4j2 API의 독립적 인 구현이 있습니까?
Ceki

5
Log4j2 API와 impl은 "단단하게 결합" 되지 않습니다 . 이러한 모든 SLF4J 구현을 사용할 수 있습니다. Log4j2 API에 대해 코딩 된 애플리케이션은 log4j-to-slf4j대신 종속성을 선택하고 log4j-core언급 한 SLF4J 구현 중 하나를 선택할 수 있습니다. 개수Log4j2 API 기본 구현 는 관련이 없습니다.
Remko Popma

19
문제는 종종 자체적으로 slf4j를 사용하는 라이브러리에 대한 종속성이 있으므로 그대로 유지하는 것이 더 쉽다는 것입니다.
Davio

18
그래서 구현을위한 인터페이스에 인터페이스를 사용해야합니까? 예, 아니요 감사합니다 ... Slf4j는 로깅 구현에 좋은 인터페이스를 제공하여 log4j를 펀치로 이겼습니다 ... log4j2는 slf4j api를 구현해야합니다. 누락 된 기능이 있으면 다시 기여하고 slf4j가 새 기능을 사용하지 않으면 기능, 그러면 log4j2 api 인터페이스에 대한 사례가있을 수 있습니다 ....
RockMeetHardplace

4
@RemkoPopma-여전히 log4j 인터페이스 사용을 반대하고 있습니다. 예, 알겠습니다-log4j2의 인터페이스-> slf4j의 인터페이스-> 어떤 구현이든 연결할 수 있지만 추상화를 추상화하지는 않을 것입니다. 감사하지만 괜찮습니다.
RockMeetHardplace
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.