2014-11-15 2 views
0

디버그 로거의 작동 방식을 더 잘 이해하기 위해 Java에서 자체 로거를 구현하려고했습니다. 아래 코드에 표시됩니다. 로저가 보통 싱글 톤이라고 이해하는 한. 내 응용 프로그램의 다른 클래스에서 같은 인스턴스를 사용하고 싶습니다. 이 로거를 사용하는 각 클래스는 다른 파일에 기록됩니다. 그러나 그것은 싱글 톤이 다른 객체에 의해 돌연변이되고 있음을 의미합니다. 이렇게하면 한 클래스 디버그 출력을 다른 클래스가 로그인해야하는 파일에 잘못 로깅하지 않을까요? 동일한 로거 인스턴스가 전체 앱에서 공유되므로 서로 다른 파일이 어떻게 생성됩니까? 응용 프로그램에서 SAME 인스턴스가 변경되었습니다. 그래서 나는 logFile 위치를 최종으로 만들기로 결정했지만 모든 클래스는 같은 파일에 기록 할 것입니다. 이 호기심에 대해 밝힐 수 있습니까?로거는 얼마나 정확히 싱글 톤이며 다른 로그 파일은 어떻게 생성됩니까?

미리 감사드립니다.

public class Logger { 

    private final String logFile; 
    private static Logger instance; 

    private Logger(String logFile){ 
     this.logFile = logFile; 
    } 

    public Logger getInstance(String logFile){ 
     synchronized(Logger.class){ 
      if(instance==null){ 
       instance = new Logger(logFile); 
      } 
     } 
     return instance; 
    } 

    public void write(String data) throws IOException{ 
     PrintWriter out = new PrintWriter (new BufferedWriter(new FileWriter(logFile))); 
     out.write(data); 
    } 

} 
+0

다른 로거를 구현하지 마십시오. 이미 너무 많습니다. slf4j, log4j, logback, commons-logging 또는 java에 포함 된 로깅. – Hannes

+0

다시 한 번 다른 로거를 구현하지 않습니다. 내부가 어떻게 작동 하는지를 배우려고 노력합니다. 이해하는 가장 좋은 방법은 이클립스에서 작은 버전을 시도하고 코딩하는 것입니다. –

+0

일반적으로 로거 객체 *는 * 싱글 톤이 아니라 오히려 계층 구조로 배열됩니다. 일반적으로 각 클래스는 자체적 인 '정적 정적 final'로거를 가져옵니다. – chrylis

답변

0

로거 구현을 이해하려면 log4j의 소스 코드를 읽을 수 있습니다. 하지만 log4j 로거에는 싱글 톤이 아니며 다중 인스턴스가 있으며 저장소 및 팩토리 패턴을 사용합니다.

관련 문제