2016-08-20 2 views
0

자바 로깅으로 충분하다고 예견 한 데스크탑 자바 애플리케이션이 있습니다. 만들 수있는 문제 간단 내가 대신 특정 로거 이름을 전달하는 로거를 얻기 위해 자바 글로벌 로거를 사용자바 로깅 글로벌 로거

 Logger logger = Logger.getGlobal(); 
     String logFilePath = Config.INSTANCE.getProperty("logFilePath"); 
     FileHandler fileHandler = new FileHandler(logFilePath); 
     logger.addHandler(fileHandler); 
     SimpleFormatter formatter = new SimpleFormatter(); 
     fileHandler.setFormatter(formatter); 

당신이, 나 또한 출력 파일 경로의 측면에서 글로벌 로거를 변경하고 위에서 볼 수 있듯이 및 포매터.

제 질문은 글로벌 로거의 범위에 관한 것입니다. 글로벌 로깅 범위는 JVM 측면입니까? 또는 응용 프로그램 전체에서 범위가 지정 되었습니까? JVM에서 전역 적으로 범위가 지정되면 동일한 JVM을 공유하는 응용 프로그램에 부작용이 발생할 것으로 예상해야합니까? 팁 : 나는이 스레드 In java.util.logging, what is the global logger for?을 통해 갔지만 주석은 내가 쓸 수있는 것이 아니었다.

답변

6

예 JVM 당 하나의 Global Logger 인스턴스가 있습니다. 따라서 JVM 내의 모든 응용 프로그램은 동일한 Global Logger 인스턴스를 공유합니다.

신고 방법을 알고 싶다면 을 참조하십시오. 그것은이 교착하는 경향이 있기 때문에 당신이 정말로 글로벌 로거를 사용하지한다고 말했다

@Deprecated 
218 public static final Logger global = new Logger(GLOBAL_LOGGER_NAME); 

라인 (218)에 다음과 같이 선언하고있다. 글로벌 로거 필드에 관한 Java 문서 인용 :

사용되지 않음 :이 필드의 초기화는 교착 상태가 발생하기 쉽습니다. 필드는 이 LogManager 클래스 초기화로 교착 상태를 유발할 수있는 Logger 클래스 초기화에 의해 초기화되어야합니다. 이러한 경우 두 개의 클래스 초기화가 완료 될 때까지 대기합니다. JDK 버젼 1.6 이후, 글로벌 로거 오브젝트를 취득하는 바람직한 방법은, Logger.getLogger (Logger.GLOBAL_LOGGER_NAME)의 호출을 개입시켜 입니다.

로깅에 대해 진지하게 생각하는 경우 로거 설정을 사용하여 세분화 된 방식으로 제어 할 수있는 구성 요소 당 로거 선언을 고려하십시오. 로깅 관련

추가 링크 :

Java Logging API Tutorial

Configuring Java Loggers

Good logging practices

0

여러 응용 프로그램이 동일한 JVM (데스크탑 응용 프로그램의 일반적인 시나리오)을 공유하는 경우 사용자가 실제로 신경 쓸 필요가 없다고 생각하면 동일한 부팅 및 시스템 클래스 로더를 공유합니다 (java.* 포함). 패키지 (응용 프로그램 클래스는 분리 가능).

결과적으로 JVM 당 전역 로거 인스턴스는 하나만 존재합니다.

관련 문제