2014-11-25 2 views
2
나는 다음과 같은 초기화 라인 일반 java.util.logging.Logger를 사용하고

:일반 자바 로거 출력 null.null

private static final Logger _log = Logger.getLogger(Login.class.getName()); 

그런 다음 나는이 (그냥 예)처럼 사용 :

24 11 월 2014 17 : 26 : 로그에

_log.log(Level.FINE, "Session id: {0}.", session.getId()); 

때때로 I는 다음 볼 수 13.692 FINE [HTTP-NIO-80 간부-1] null.null Sessi on ID : 18BD6989930169F77565EA2D001A5759.

그러나 대부분의 경우 시간이 나와도 호출 클래스와 함수가 올바르게 표시됩니다. 그것은 다른 클래스와 멤버들에서도 발생합니다. 왜 이런 일이 일어날 지 모르겠다. Loggger의 버그입니까?

+0

이 메시지는 GlassFish의 com.sun.enterprise.server.logging.UniformLogFormatter 입니까? 그렇다면 GF 버전은 무엇입니까? – jmehrens

+0

아니요. 죄송합니다. 패키지 이름을 언급하지 않았습니다. java.util.logging.Logger입니다. 나는 Tomcat과 함께 사용한다. –

+0

나는 또한 바람둥이 (이클립스 내에서가 아니라)와 함께 이것을 경험하고있다. 내 자신의 사용자 지정 LogFormatter를 사용합니다. – Zalumon

답변

2

출력은 'org.apache.juli.OneLineFormatter'에서 나온 것처럼 보이고 'null.null'은 소스 클래스 및 소스 메소드 이름입니다. LogRecord.getSourceMethodName 문서에서 :

정보를 얻을 수 없으면 null이 될 수 있습니다.

판별 할 수없는 수 또는 코드는 일본어를 캡처되지 버그가 'org.apache.juli.AsyncFileHandler'의 소스 코드를 찾고

forced to null.를왔다 callsite.

AsynchFileHandler에 install a filter을 작성하여 스레드가 손을 내기 전에 메서드와 클래스 이름을 강제로 계산할 수 있습니다.

public class InferCallerFilter implements Filter { 

     public boolean isLoggable(LogRecord record) { 
      record.getSourceMethodName(); //Infer caller. 
      return true; 
     } 
    } 

심지어 MemoryHandler는 JDK gets this wrong 포함 다음은 이러한 필터의 예이다. 로깅 핸들러가 LogRecord를 다른 thread에 전달하는, 또는 RMI를 개입시켜 전송하려고하는 경우 및 그 후에 메소드 명과 클래스 이름 정보를 취득하고자하는 경우

따라서, 호출해야합니다 : LogRecord의 문서 당 getSourceClassName 또는 getSourceMethodName 중 하나가 값이 채워 강제합니다.

+0

예, 가능합니다. 나는 그것이 언제 null을 보여 주는지 그리고 언제 제대로 작동 하는지를 알 수 없었다.대부분의 경우 같은 방법으로 로깅이 정상적으로 작동하지만 때때로 null이 표시됩니다. –

+0

AsynchFileHandler를 사용하는 경우 코드를 전환하여 FileHander를 사용하거나 InferCallerFilter를 설치하여 핸드 오프 버그를 배제하십시오. – jmehrens

0

나는 "해결"이 포맷 방식의 맨 처음에 소스 클래스 이름과 소스 메소드 이름을 얻기 위해 내 사용자 지정 LogFormatter을 변경하여. 난 더 이상 어떤 null.null 항목을 관찰하지 않은 변경 후

이러한 방법의 반환 값은 "유효 기간"을 갖고있는 것 같다는 ...

@Override 
    public String format(LogRecord record) 
    { 
    String sourceClassName = record.getSourceClassName(); 
    String sourceMethodName = record.getSourceMethodName(); 
    ... 
    } 

지금까지, 나는 많은 경우에 한하기 전에 그들의.

+0

첫 번째 스레드가 [LogRecord.infercaller] (http://hg.openjdk.java.net/jdk8u/jdk8u60/jdk/file/935758609767/src/share/classes/java/)를 호출하는 것이 만료되는 것은 아닙니다. util/logging/LogRecord.java)가 영원히 우승자입니다. 그래서 javadoc은 스레드가 손을 떼기 전에 getSourceXXX를 호출하는 것에 대해 경고합니다. – jmehrens

관련 문제