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.properties
JRE_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.INFO
FINE
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
로거에 루트 로거에도 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」가 있습니다.ConsoleHandler
로 INFO
루트로 하려면 , 이 코드를 .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이 아닌) 수준 값을 사용하여 가장 가까운 상위 노드에서 수준을 상속해야 함을 의미합니다.
는 로그인이 예상대로 작동하지 않는 이유를 해결하는 데 도움이 되는 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");
실제 문제를 발견했지만 답변에 기재되어 있지 않았습니다.일부 유닛 테스트에서는 같은 테스트 스위트 내에서 로깅 초기화 코드가 여러 번 실행되어 이후의 테스트에서는 로깅이 엉망이 되었습니다.
이 솔루션은 변경에 따른 유지 보수성 및 설계에 대해 더 나은 것으로 생각됩니다.
jar 파일에 포함할 리소스 프로젝트 폴더에 내장된 로깅 속성 파일을 만듭니다.
# Logging handlers = java.util.logging.ConsoleHandler .level = ALL # Console Logging java.util.logging.ConsoleHandler.level = ALL
코드에서 속성 파일을 로드합니다.
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
'source' 카테고리의 다른 글
PHP/MySQL 행을 삽입한 후 'id'를 가져옵니다. (0) | 2023.01.15 |
---|---|
마우스 위치 가져오기 (0) | 2023.01.12 |
Panda DataFrame에 헤더 행을 추가하는 방법 (0) | 2023.01.12 |
maxscale이 gtid_binlog_pos를 찾을 수 없습니다. (0) | 2023.01.12 |
PHP와 비교하여 Node.js를 사용하는 이점은 무엇입니까? (0) | 2023.01.12 |