java.util.logging을 log4j로 보내는 방법은 무엇입니까?


84

log4j에 대한 모든 로깅을 수행하는 기존 응용 프로그램이 있습니다. 우리는 log4j를 사용하거나 Commons Logging에 대해 로그하는 다른 많은 라이브러리를 사용합니다. 이는 결국 우리 환경에서 log4j를 사용합니다. 종속성 중 하나는 slf4j에 대해서도 로그를 기록하는데, 이는 결국 log4j에도 위임되기 때문에 잘 작동합니다.

이제 일부 캐싱 요구를 위해이 응용 프로그램에 ehcache를 추가하고 싶습니다. 이전 버전의 ehcache는이 시나리오에서 완벽하게 작동했을 commons-logging을 사용했지만 1.6-beta1 버전 에서는 commons-logging에 대한 종속성을 제거하고 대신 java.util.logging으로 대체했습니다.

java.util.logging에서 사용할 수있는 기본 제공 JDK 로깅에 익숙하지 않은 경우 JUL로 전송 된 로그 메시지를 log4j에 대해 로깅하는 쉬운 방법이 있으므로 기존 구성을 사용하고 모든 로깅에 대해 설정할 수 있습니다. ehcache에서?

JUL에 대한 javadocs를 살펴보면 LogManager사용 되는 구현 을 변경하기 위해 여러 환경 변수를 설정할 수 있으며 아마도 LoggerJUL Logger클래스 에서 log4j를 래핑하는 데 사용할 수 있습니다. 이것이 올바른 접근 방식입니까?

라이브러리가 내장 된 JDK 로깅을 사용하면 (대부분의) 세계가 타사 라이브러리를 대신 사용할 때 이러한 골칫거리가 될 수 있다는 것은 아이러니 한 일입니다.

답변:


37

내가 성공적으로 사용한 한 가지 접근 방식은 slf4j 를 기본 로깅 API로 사용하는 것입니다. 그런 다음 slf4j가 log4j에 바인딩됩니다. (7월 같은) 다른 프레임 워크를 사용하여 3 자 종속성 할 수 브리지 SLF4J에.


2
좋은 링크입니다.하지만 당신은 # jul-to-slf4j
araqnid

이것은 좋은 접근 방식처럼 들리지만, 작동하도록 할 수없는 것 같습니다. (
matt b

2
또한 ehcache만큼 인기있는 라이브러리가 java.util.logging과 같은 것으로 전환 할 것이라고 믿을 수 없습니다.
matt b

1
@matt b, JUL은 Java 런타임에 항상 존재하므로 최소한의 외부 종속성이 필요합니다. 그러나 내 눈에는 그 코드의 사용법에 익숙하지 않은 사람들이 작성한 코드의 진정한 예입니다. 구성 시스템이 다소 불편합니다.
Thorbjørn Ravn Andersen 2010-06-20

1
문제는 SLF4J를 JUL에 연결하면 로깅 성능이 끔찍하다는 것입니다. 특히 생성 한 각 로그 행은 사용할 로거 컨텍스트를 결정하기 위해 예외가 발생합니다. 이로 인해 많은 오버 헤드가 발생하고 프로세스 속도가 느려집니다
Egwor

19

우리는 현재 프로젝트에서 SLF4J 를 사용 하며 매우 잘 작동합니다. SLF4J는 Log4J의 창시자 인 Ceki Gülcü가 작성했으며 그는 정말 훌륭한 일을 해냈습니다. 코드에서 SLF4J 로깅 API를 직접 사용하고 Jakarta Commons Logging (JCL), java.util.logging (JUL) 및 Log4J API의 호출 이 모두 SLF4J API에 연결되도록 SLF4J를 구성합니다. 우리는 다른 로깅 API를 선택한 타사 (오픈 소스) 라이브러리를 사용하기 때문에 그렇게해야합니다.

SLF4J 하단에서 특정 로거 구현을 사용하도록 구성합니다. 내부 또는 "간단한"로거와 함께 제공되며 Log4J, JUL 또는 Logback으로 이를 재정의 할 수 있습니다 . 구성은 클래스 경로에 다른 jar 파일을 놓기 만하면됩니다.

원래는 Ceki Gülcü가 작성한 Logback 구현을 사용했습니다. 이것은 매우 강력합니다. 그러나 우리는 로그 뷰어가 JUL 형식의 메시지를 예상하는 Glassfish Java EE 애플리케이션 서버에 애플리케이션을 배포하기로 결정했습니다. 그래서 오늘 저는 Logback에서 JUL로 전환했고 몇 분만에 두 개의 Logback jar를 JUL 구현에 연결하는 SLF4J jar로 교체했습니다.

따라서 @overthink와 마찬가지로 설정에서 SLF4J를 사용하는 것이 좋습니다.


8
Ceki는 로깅 프레임 워크 / 파사드를 재창조하기 위해 몇 번이나 필요합니까?
mP.

@mP : 로깅은 화려하지 않을 수 있지만 대규모 상용 등급 소프트웨어에 대한 중요한 요구 사항입니다. 그리고 SLF4J는 서로 다른 로깅 프레임 워크를 사용하는 코드 통합 문제를 해결합니다 (Sun이 Log4J를 채택하는 대신 java.utils.logging을 개발하기로 선택함으로써 더욱 시급함).
짐 Ferrans

3
@mP, slf4j는 Sun이 JUL과 함께 한 나쁜 일 때문에 필요했습니다. Logback은 새로운 프로젝트가 아닌 log4j의 포크입니다.
Thorbjørn Ravn Andersen 2010-06-20

3
로그 백이 필요하다는 것을 알았습니다. 아파치가 아니라 실제로 문서화되어 있습니다.
Spencer Kormos 2011 년

13

JUL과 log4j를 연결하는 SLF4J보다 간단한 대안이 있습니다. http://people.apache.org/~psmith/logging.apache.org/sandbox/jul-log4j-bridge/examples.html을 참조 하십시오.

클래스 경로에 jul-log4j-bridge를 넣고 시스템 속성을 추가하기 만하면됩니다.

-Djava.util.logging.manager=org.apache.logging.julbridge.JULBridgeLogManager

jul-log4j-bridge는 Maven Central에 없으며이 저장소에서 가져올 수 있습니다.

<repository>
  <id>psmith</id>
  <url>http://people.apache.org/~psmith/logging.apache.org/repo</url>
  <releases>
    <enabled>false</enabled>
  </releases>
</repository>

다음과 함께 사용됩니다.

<dependency>
  <groupId>org.apache.logging</groupId>
  <artifactId>apache-jul-log4j-bridge</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>log4j</groupId>
      <artifactId>apache-log4j-component</artifactId>
    </exclusion>
  </exclusions>
</dependency>

다음 단계에 따라 소스에서 다시 빌드 할 수도 있습니다.

  1. svn co http://svn.apache.org/repos/asf/logging/sandbox/jul-to-log4j-bridge/
  2. pom.xml을 편집하고 log4j : log4j : 1.2.15에 대한 종속성을 log4j : apache-log4j-extras : 1.2.17로 바꾸고 apache-log4j-component에 대한 종속성을 제거하십시오.
  3. mvn 패키지

4
코드를 변경하지 않고도 할 수 있기 때문에 더 간단하다고 생각합니다. 시스템 속성을 추가하기 만하면됩니다. SLF4J는 아직 유사한 메커니즘을 제안하지 않으며 코드 나 logging.properties파일을 변경 합니다.
Emmanuel Bourg 2013

1
이것은 log4j2에 존재하지 않습니다. 불행히도 :(
BeepDog

JulLog4jBridge.assimilate();o_0
Bastian Voigt

2
경고! jul-log4j-bridge출시되지 않은 apache-log4j-companions번들 (폐기 된에서 백 포트 log4j 1.3)을 사용합니다. 그것을 만드는 데 어려움을 겪을 것입니다. 당연히 다리 자체도 출시 전 포기됩니다.
ivan_pozdeev jul.

@ivan_pozdeev 좋은 지적, 감사합니다. 빌드 지침을 추가했습니다.
Emmanuel Bourg 2015

9

2014 년 10 월

log4j 2.1 버전이 있기 때문에 log4j-jul 구성 요소가 있으므로이를 정확히 허용합니다. 그래도 log4j 1을 사용하는 경우이 접근 방식을 사용하려면 log4j2로 업그레이드 할 수 있어야합니다.

JDK 로깅 어댑터

LogManager 클래스

log4j 1.x에서 log4j 2로 마이그레이션


2
현재 (2018 년 중반)이 대답이 받아 들여 져야합니다
rmuller

미래의 독자 : 나는 이것이 효과가 있음을 확인합니다. 따라서 기본적으로 (1) 이것을 pom mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jul에 추가하고 (2) 첫 번째 링크에 시스템 속성을 추가합니다 (예 : JVM 매개 변수에서 -Djava. util.logging.manager = org.apache.logging.log4j.jul.LogManager)
Hossam El-Deen

3

내가 믿는 slf4j 사이트에는 slf4j를 통해 java.util.logging 이벤트를 전달하는 브리지가 있습니다 (따라서 log4j로).

예, SLF4J 다운로드에는 jul-to-slf4j가 포함되어 있습니다. SLF4J에 레코드를 전달하는 JUL 핸들러가 포함되어 있습니다.


2

@Yishai-내 위키에 링크를 게시 해 주셔서 감사합니다. 이 예제는 JUL을 Log4J로 리디렉션하고 몇 년 동안 프로덕션 시스템에서 실행했습니다. JBoss 5.x는 이미 JUL을 Log4J로 리디렉션하므로 업그레이드 할 때 제거했습니다. 나는 SLF4J로 리디렉션되는 새로운 것을 가지고 있으며, 지금은 몇 가지를 사용합니다. 기회가되면 게시하겠습니다.

그러나 SLF4J에는 이미 다음이 있습니다.

http://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.