2012-09-05 2 views
1

java.util.logging.Logger 응용 프로그램에 로그인하기위한 클래스입니다. 응용 프로그램 로그가 log.txt 파일에 직접 저장되도록 FileHandler를 추가했습니다.로거가 제대로 작동하지 않습니다.

그러나 어떤 이유로 응용 프로그램이 종료 된 후 로그가 완료되지 않습니다. cmd에서는 모든 명령문을 볼 수 있지만 파일에는 추가되지 않습니다.

내가하여 로거의 FileHandler를 설정 :

private void setLogger() { 
    try { 
     FileHandler hand = new FileHandler("log/log.txt", true); 
     hand.setFormatter(new SimpleFormatter()); 
     Logger log = Logger.getLogger(ImageRename.MAIN_LOG); 
     //log.setUseParentHandlers(false); 
     log.addHandler(hand); 
     log.setLevel(Level.ALL);   
    } catch (IOException e) { 
     System.out.println("Could Not set logger"); 
    } 
} 

홍조에 문제? 그것을 해결하는 방법? 감사.

PS :. 디버깅, 나는 눈치를

사이 Logger.getLogger (ImageRename.MAIN_LOG) .getHandlers() 길이

반환 0에 반환해야 같은 것을 1 처음에는 1을 인쇄했지만, 줄을 어딘가에서는 0이됩니다.

+0

로깅을 처리하는 가장 좋은 방법 중 하나는 [Apache log4j] (http://logging.apache.org/log4j/1.2/)로 작업하는 것입니다. 이것은 Java 용 로깅 프레임 워크 중 하나 인 사용하기 쉽고 사용자 정의가 용이합니다. – Sujay

+1

라이브러리 팽창을 피하십시오. log4j가 * 현재 * Java 로깅 (Java 1.4에서 도입)에 비해 별다른 이점을 얻지 못합니다. –

+0

우선 순위가 가장 높은 로깅을 시도하고 * 처리기 *의 수준을 설정해보십시오. 아마도 처리기가이 수준에서 기록하도록 설정되지 않았을 것입니다. –

답변

3

문제는 ... 쓰레기 수거입니다.

  1. 당신은 Logger.getLogger(ImageRename.MAIN_LOG);
  2. 당신 설치 로거 전화 : 무슨 일이 일어나고 무엇

    은 다음과 같다.

  3. Java 통지 Java 참조는 참조되지 않으며이를 버립니다.
  4. Logger.getLogger(ImageRename.MAIN_LOG);으로 전화를 걸고 동일한 로거를 사용하려고합니다.
  5. 신선한 로거가 기본 구성으로 설정됩니다.

두 가지 방법으로이 문제를 방지 할 수 있습니다

  • 구성에 대한 구성 파일 logging.properties을 사용합니다. 로거를 만들 때 Java 로깅 API는 구성을 참조하므로 적절하게 다시 작성합니다.
  • 정적 참조를 사용하십시오. 어쨌든 모범 사례입니다. 로거 각 클래스를 착용 효과 :

    private final static Logger LOG = 
        Logger.getLogger(ExampleClass.class.getName()); 
    

를 클래스가 쓰레기 AFAICT를 수집해서는 안 다음로드된다.

1

fileHandler.setLevel(Level.ALL); 

: 당신의 문제가있을 수 있습니다 (Google을 통해 발견) 예를 들어

참고 다음 줄에 대한 http://www.massapi.com/class/fi/FileHandler.html (참고 :.이 아니라 Logger 또는 메시지의의 Handler의 수준입니다)

디버깅하려면 먼저 ERROR 수준의 메시지를 가져 오십시오. 레벨 INFO 이하의 메시지는 기본적으로 억제됩니다.

가능한 한 빨리 로깅 수준을 설정해보십시오. 내 경험에 의하면, 자바 로깅을 구성하는 가장 신뢰할 수있는 방법으로 자바 프로퍼티 파일을 사용하고 호출하는 것입니다 :

-Djava.util.logging.config.file=path/to/file/logging.properties 

이유 당신이 할 설정이 가끔 하지이 로거에 적용되기 전에 을 만든 것입니다 로깅을 변경하면 설정이로드됩니다.

+0

내 모든 로그는 정보 등급입니다. "INFO 이하의 메시지는 기본적으로 억제되어 있습니다." – Jatin

+0

로거 구성에 속성 파일을 사용하는 경우 +1. 또한 "All"보다는 미리 정의 된 레벨을 사용하는 것이 좋습니다. 이 경우'Level.FINE' 또는 Level.FINEST를 설정해도 도움이 될 것입니다. – Sujay

+0

죄송합니다. 기본 레벨은 * INFO 이상일뿐입니다. 그러나 로깅을 시작하는 것만 큼 알 수 있습니다. 'INFO' 그 자체. 그럼 당신은 그들을보아야합니다. 어쨌든 디버깅을 위해 더 높은 수준에서 로깅을 시도하십시오! –

관련 문제