source

Level이 되는가?FINE 로깅 메시지가 표시되지 않습니까?

lovecheck 2023. 1. 12. 22:09
반응형

Level이 되는가?FINE 로깅 메시지가 표시되지 않습니까?

상태에 대한 JavaDocs:


내림차순으로 표시되는 레벨은 다음과 같습니다.

  • SEVERE최고값')
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST (값) (값)

원천

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        logger.setLevel(Level.FINER);
        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

산출량

Logging level is: FINER
Jun 11, 2011 9:39:23 PM LoggingLevelsBlunder main
INFO: 0 0
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 1 1
Jun 11, 2011 9:39:24 PM LoggingLevelsBlunder main
INFO: 2 4
Press any key to continue . . .

문제문

에서는, 「」를 하고 있습니다.Level로로 합니다.FINER그래서 루프마다 2개의 메시지가 표시될 것으로 예상했습니다. 각의 메시지가 됩니다(「1」).Level.FINE메시지가 없습니다).

질문.

'우리'를 볼 수 있을까요?FINE , )FINER ★★★★★★★★★★★★★★★★★」FINEST★★★★★★★★★★★★★★★★★?

업데이트(솔루션)

Vineet Rynolds의 답변 덕분에 이 버전은 제 기대대로 작동합니다.3 x 로 표시됩니다.INFO및 3 x 3 x 3 xFINE메시지를 표시합니다.

import java.util.logging.*;

class LoggingLevelsBlunder {

    public static void main(String[] args) {
        Logger logger = Logger.getAnonymousLogger();
        // LOG this level to the log
        logger.setLevel(Level.FINER);

        ConsoleHandler handler = new ConsoleHandler();
        // PUBLISH this level
        handler.setLevel(Level.FINER);
        logger.addHandler(handler);

        System.out.println("Logging level is: " + logger.getLevel());
        for (int ii=0; ii<3; ii++) {
            logger.log(Level.FINE, ii + " " + (ii*ii));
            logger.log(Level.INFO, ii + " " + (ii*ii));
        }
    }
}

로거는 메시지를 기록할 뿐입니다.즉, 로그 레코드(또는 로깅 요청)를 작성합니다.이러한 메시지는 수신처에 게시되지 않으며, 이는 핸들러가 처리합니다.로거의 레벨을 설정하면, 그 레벨 이상에 일치하는 로그레코드만 생성됩니다.

(출력 위치가 System.err인지 파일인지 유추할 수 없지만 전자가 될 것으로 생각됩니다)를 사용하고 있을 가능성이 있습니다.기본적으로 이 레벨의 로그레코드가 공개됩니다.Level.INFO하고, 「」의 레코드를 할 Level.FINER을 사용법

기본 설계를 이해하기 위해 Java Logging Overview 가이드를 읽는 것이 좋습니다.이 가이드에서는 로거와 핸들러의 개념에 대해 설명합니다.

핸들러 레벨 편집

1. 컨피규레이션파일 사용

java.util.logging)입니다.logging.propertiesJRE_HOME/lib콘솔 핸들러.

java.util.logging.ConsoleHandler.level = FINER

2. 실행 시 핸들러 작성

이는 글로벌 설정을 덮어쓰게 되므로 권장하지 않습니다.코드 베이스 전체에서 이것을 사용하면, 로거 설정이 관리 불능이 될 가능성이 있습니다.

Handler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.FINER);
Logger.getAnonymousLogger().addHandler(consoleHandler);

이유

.sva.svaaces.svaaces.sva.sva.sva.는 기본 루트 있습니다.Level.INFO 핸들러에 접속되어 도 디폴트로 Console Hand Console Handler는 "Console Handler"로 되어 있습니다Level.INFOFINE INFO디폴트로는 미세한 메시지는 표시되지 않습니다.


솔루션 1

패키지 이름 또는 를 사용하여 응용 프로그램 전체를 위한 로거를 만들고 자체 Console Logger를 이 로거에 연결합니다.다음으로 루트 로거에 셧다운을 요구하거나(고레벨 메시지의 중복 출력을 피하기 위해), 로그를 루트로 전송하지 않도록 로거에 요구합니다.

public static final Logger applog = Logger.getGlobal();
...

// Create and set handler
Handler systemOut = new ConsoleHandler();
systemOut.setLevel( Level.ALL );
applog.addHandler( systemOut );
applog.setLevel( Level.ALL );

// Prevent logs from processed by default Console handler.
applog.setUseParentHandlers( false ); // Solution 1
Logger.getLogger("").setLevel( Level.OFF ); // Solution 2

솔루션 2

또는 루트 로거의 막대를 낮출 수도 있습니다.

코드별로 설정할 수 있습니다.

Logger rootLog = Logger.getLogger("");
rootLog.setLevel( Level.FINE );
rootLog.getHandlers()[0].setLevel( Level.FINE ); // Default console handler

또는 로그 컨피규레이션파일을 사용하고 있는 경우는, 다음의 순서에 따릅니다.

.level = FINE
java.util.logging.ConsoleHandler.level = FINE

글로벌 레벨을 낮추면 일부 Swing 컴포넌트나 JavaFX 컴포넌트 등 코어 라이브러리에서 메시지가 표시되기 시작할 수 있습니다.이 경우 루트 로거에 필터를 설정하여 프로그램에서 메시지가 아닌 메시지를 필터링할 수 있습니다.

왜죠

@하지 않는 는 @Sheepy가 @Sheepy에 있기 입니다.java.util.logging.Logger가 있습니다.Level.INFO및 , 。ConsoleHandler되어 있는 로 「」로 설정되어 있습니다.Level.INFO 을 「」를 참조해 주세요.FINE , )FINER ★★★★★★★★★★★★★★★★★」FINEST그 의 ConsoleHandler로로 합니다.Level.FINE음음음같 뭇매하다

Logger.getLogger("").setLevel(Level.FINE);
Logger.getLogger("").getHandlers()[0].setLevel(Level.FINE);


업데이트 문제(솔루션)

와 같이 에서는 @mins의 합니다.INFO로거에 루트 로거에도 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」가 있습니다.ConsoleHandlerINFO루트하려면 , 이 코드.logger.setUseParentHandlers(false);

@Sheepy에서 언급된 루트 로거의 기본 콘솔핸들러에 의해 로그가 처리되지 않도록 하는 다른 방법이 있습니다.예를 들어 다음과 같습니다.

Logger.getLogger("").getHandlers()[0].setLevel( Level.OFF );

★★★★★★★★★★★★★★★★★.Logger.getLogger("").setLevel( Level.OFF );는 루트 로거에 직접 전달된 메시지만 차단하고 하위 로거에서 보낸 메시지는 차단하지 않기 때문에 작동하지 않습니다.「 」가 하기 위해서,Logger Hierarchy 그림, , 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림, 그림.

여기에 이미지 설명 입력

public void setLevel(Level newLevel) 이 로거가 기록할 메시지 수준을 지정하는 로그 수준을 설정합니다.이 값보다 낮은 메시지레벨은 폐기됩니다레벨 값 레벨OFF를 사용하여 로깅을 끌 수 있습니다.새 수준이 null이면 이 노드가 특정(null이 아닌) 수준 값을 사용하여 가장 가까운 상위 노드에서 수준을 상속해야 함을 의미합니다.

Java 로깅이 작동하지 않는 이유는 무엇입니까?

는 로그인이 예상대로 작동하지 않는 이유를 해결하는 데 도움이 되는 jar 파일을 제공합니다.로그 계층에서 설치된 로거 및 핸들러, 설정된 수준 및 수준에 대한 완전한 덤프가 제공됩니다.

다른 차종을 시험해 본 결과, 적절할 수 있습니다.

    Logger logger = Logger.getLogger(MyClass.class.getName());        
    Level level = Level.ALL;
    for(Handler h : java.util.logging.Logger.getLogger("").getHandlers())    
        h.setLevel(level);
    logger.setLevel(level);
// this must be shown
    logger.fine("fine");
    logger.info("info");

실제 문제를 발견했지만 답변에 기재되어 있지 않았습니다.일부 유닛 테스트에서는 같은 테스트 스위트 내에서 로깅 초기화 코드가 여러 번 실행되어 이후의 테스트에서는 로깅이 엉망이 되었습니다.

이 솔루션은 변경에 따른 유지 보수성 및 설계에 대해 더 나은 것으로 생각됩니다.

  1. jar 파일에 포함할 리소스 프로젝트 폴더에 내장된 로깅 속성 파일을 만듭니다.

    # Logging
    handlers = java.util.logging.ConsoleHandler
    .level = ALL
    
    # Console Logging
    java.util.logging.ConsoleHandler.level = ALL
    
  2. 코드에서 속성 파일을 로드합니다.

    public static java.net.URL retrieveURLOfJarResource(String resourceName) {
       return Thread.currentThread().getContextClassLoader().getResource(resourceName);
    }
    
    public synchronized void initializeLogger() {
       try (InputStream is = retrieveURLOfJarResource("logging.properties").openStream()) {
          LogManager.getLogManager().readConfiguration(is);
       } catch (IOException e) {
          // ...
       }
    }
    

언급URL : https://stackoverflow.com/questions/6315699/why-are-the-level-fine-logging-messages-not-showing

반응형