2015-01-08 1 views
-1

내 프로젝트에서 일부 다른 로거를 사용하며, 모두 FileHandler와 ConsoleHandler가 첨부되어 있습니다. 나는 다음과 같은 클래스와 그 로거를 만들 : 당신이 볼 수 있듯이이 파일로 콘솔에 로그인해야하는지 여부를ConsoleHandler는 로그 레벨이 경고 임에도 불구하고 infos를 콘솔에 기록합니다.

public class Logging { 

static { 
    System.setProperty("java.util.logging.config.file", "properties/logging.properties"); 
    try { 
     LogManager.getLogManager().readConfiguration(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Method to create a new logger using java.util.logging. 
* @param name The name of the logger. 
* @param logLevelFile The log level for writing into the log file. 
* @param logLevelConsole The log level for writing on the console. 
* @param logToFile True, if file logging shall be active. 
* @param logToConsole True, if console logging shall be active. 
* @return The new logger instance. 
*/ 
public static Logger createLogger(String name, Level logLevelFile, Level logLevelConsole, boolean logToFile, boolean logToConsole) { 

    Logger logger = Logger.getLogger(name); 
    logger.setLevel(Level.ALL); 
    logger.setUseParentHandlers(false); 

    if (logToFile) { 
     final Handler fileHandler; 
     try { 

      fileHandler = new FileHandler("log/" + name + ".log"); 
      fileHandler.setLevel(logLevelFile); 
      logger.addHandler(fileHandler); 

      // close file handler, so that *.lck files will be deleted by 
      // JVM 
      Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
       @Override 
       public void run() { 
        fileHandler.close(); 
       } 
      })); 

     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    if (logToConsole) { 

     // remove existing console handlers 
     Handler[] handlers = logger.getHandlers(); 
     for (Handler handler : handlers) { 
      if (handler.getClass() == ConsoleHandler.class) 
       logger.removeHandler(handler); 
     } 

     Handler consoleHandler = new ConsoleHandler(); 
     consoleHandler.setLevel(logLevelConsole); 

     logger.addHandler(consoleHandler); 

    } 

    return logger; 

} 

} 

각 로거는 부울을 가져옵니다. 설정에 따라 콘솔이나 파일에 어떤 레벨이 기록되는지에 따라 다릅니다.

내 logging.properties은 같이 :

는 문제가
Logging.createLogger(Properties.getGeneralLoggerName(), Level.INFO, Level.INFO, true, true); 
Logging.createLogger(Properties.getBluetoothLoggerName(), Level.INFO, Level.INFO, true, true); 
Logging.createLogger(Properties.getStrategicProcessesLoggerName(), Level.INFO, Level.WARNING, true, true); 
Logging.createLogger(Properties.getNetworkLoggerName(), Level.INFO, Level.WARNING, true, true); 
Logging.createLogger(Properties.getGPIOLoggerName(), Level.INFO, Level.WARNING, true, true); 
Logging.createLogger(Properties.getFatigueDetectionLoggerName(), Level.INFO, Level.WARNING, true, true); 
Logging.createLogger(Properties.getGPSACCLoggerName(), Level.INFO, Level.WARNING, true, true); 

, 즉 예를 들어 지난 로거는에 경고 만 기록하지 않습니다 다음과 같이

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler 

java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter 
java.util.logging.FileHandler.formatter  = java.util.logging.SimpleFormatter 
java.util.logging.SimpleFormatter.format = [%1$td.%1$tm.%1$tY-%1$tH:%1$tM:%1$tS] [%2$s] %4$s: %5$s %n 

# approximate amount of bytes to write to a log file, before rotating to a new file 
java.util.logging.FileHandler.limit = 500000 

# number of log files to use in the log file rotation 
java.util.logging.FileHandler.count = 0 

# whether or not the FileHandler should append to an existing file or not (true or false) 
java.util.logging.FileHandler.append = false 

내 로거를 초기화 콘솔뿐만 아니라 정보 로그. 내 맥 책이 모든 작동합니다,하지만 내 임베디드 시스템 (우분투 14.04 함께 Odroid U3)이 코드를 사용할 때 실패하고 콘솔 출력 방대한 있습니다. 출력을 파일에 기록하는 대신 콘솔에 기록됩니다.

누군가 도움을 줄 수 있습니까?

감사합니다.

답변

0

샘플 코드에서 '렉'파일을 제거하기 위해 FileHandler를 닫는 종료 훅을 추가하고 있습니다. 그 이유는 당신이 not holding a strong reference to your created logger이기 때문입니다. 로거에게 강한 언급을해야합니다 otherwise your added handlers will not be closed on shutdown by the LogManager.

logger get garbage collected 다음 로거의 새 인스턴스가 'createLogger'메소드에서 설정된 레벨이 아닌 상위 로거의 레벨 설정을 상속하게하는 경우.

출력을 파일에 기록하는 대신 콘솔에 기록됩니다.

FileHandler는 예외를 throw 할 수 있습니다. 예외의 원인을 수정하십시오. addShutdownHook 메소드는, 코드에 트랩되지 않는 예외도 슬로우 할 수 있습니다.

관련 문제