development

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

big-blog 2020. 9. 22. 20:51
반응형

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


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 로깅을 사용하면 (대부분) 나머지 세계가 타사 라이브러리를 대신 사용할 때 이러한 골칫거리가 될 수 있다는 것은 아이러니 한 일입니다.


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


우리는 현재 프로젝트에서 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를 사용하는 것이 좋습니다.


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 패키지

2014 년 10 월

Since version 2.1 of log4j exists the component log4j-jul, which allows exactly this. Still, in case you are using log4j 1, it has to be possible to upgrade to log4j2 in order to use this approach.

JDK Logging Adapter

Class LogManager

Migrate from log4j 1.x to log4j 2


The slf4j site I believe has a bridge for passing java.util.logging events via slf4j (and hence to log4j).

Yes, the SLF4J download contains jul-to-slf4j which I believe does just that. It contains a JUL handler to pass records to SLF4J.


@Yishai - Thanks for posting the link to my wiki. The example there redirects JUL to Log4J and I've had it running in a production system for a few years. JBoss 5.x already redirects JUL to Log4J, so I took it out when we upgraded. I have a newer one that redirects to SLF4J, which I use on a few things now. I'll post that when I get a chance.

However, SLF4J already has it:

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


you should manually add blew at startup

SLF4JBridgeHandler.removeHandlersForRootLogger()
SLF4JBridgeHandler.install()

demo -> https://gist.github.com/jiahut/654ecc75a13b0a1d8f3b4d5d2d69dc6d

참고URL : https://stackoverflow.com/questions/869945/how-to-send-java-util-logging-to-log4j

반응형