2015-01-08 70 views
-1

在我的項目中,我使用了一些不同的記錄器,它們都有一個FileHandler和一個ConsoleHandler。我創建這些記錄器下面的類:ConsoleHandler將信息記錄到控制檯,儘管日誌級別是警告

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看起來像:

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 

我初始化我的伐木工人如下:

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); 

的問題是,例如過去的記錄器不記錄僅顯示警告進控制檯,還有信息日誌。在我的Mac電腦上,這一切都正常,但是當我在嵌入式系統(帶有Ubuntu 14.04的Odroid U3)上使用此代碼時,它失敗了,控制檯輸出很大。不是將輸出記錄到文件中,而是將它們登錄到控制檯中。

有人可以幫忙嗎?

謝謝!

回答

0

在您的示例代碼中,您將添加一個關閉鉤子來關閉FileHandler以刪除'lck'文件。你必須這樣做的原因是因爲你是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可以拋出異常。修復異常的原因。 addShutdownHook方法還可以引發未被捕獲到的代碼。

相關問題