1. 程式人生 > >Java 日誌管理

Java 日誌管理

Logger.java

//Level.java Log級別定義
[quote]OFF 一個特殊的級別,它可以關閉日記記錄
SEVERE severe級別的的資訊應該描述非常重要的可能阻止程式正常執行的事件,應該清楚的描述給終端使用者或者系統管理員 [si'viə] 嚴重的,劇烈的 1000。
WARNING warning級別的資訊應該描述終端使用者或者系統管理員感興趣的資訊,或者是指明潛在的錯誤 900。
INFO info級別的資訊用於記錄常規資訊,描述終端使用者或者系統管理員感興趣的資訊 800。[/quote]

日誌輸出到後臺控制檯
再來看看LogManager.java類;
可以看到它有一個static靜態程式碼塊,裡面尋找java.util.logging.manager配置,如果有的話,則將該類作為LogManager並例項化它,否則,新建一個預設的java.util.logging.LogMangger例項;
在getLogManager()這個方法中,負責去裝載日誌配置檔案logging.properties中的配置,readConfiguration()。首先是從System.getProperty("java.util.logging.config.class");尋找Config的Class類,方便第三方日誌框架進行重寫。如果沒有則通過System.getProperty("java.util.logging.config.file")尋找。還沒有的話,那就使用預設的jre(java.home)目錄下的lib目錄下的logging.properties檔案,裡面會進行Logger.setLever(),日誌級別可以在日誌檔案裡面定義

    
/**
* Reinitialize the logging properties and reread the logging configuration
* from the given stream, which should be in java.util.Properties format.
* A PropertyChangeEvent will be fired after the properties are read.
* <p>
* Any log level definitions in the new configuration file will be
* applied using Logger.setLevel(), if the target Logger exists.
*
* @param ins stream to read properties from
* @exception SecurityException if a security manager exists and if
* the caller does not have LoggingPermission("control").
* @exception IOException if there are problems reading from the stream.
*/
public void readConfiguration(InputStream ins) throws IOException, SecurityException {
checkAccess();
reset();

// Load the properties
props.load(ins);
// Instantiate new configuration objects.
String names[] = parseClassNames("config");

for (int i = 0; i < names.length; i++) {
String word = names[i];
try {
Class clz = ClassLoader.getSystemClassLoader().loadClass(word);
clz.newInstance();
} catch (Exception ex) {
System.err.println("Can't load config class \"" + word + "\"");
System.err.println("" + ex);
// ex.printStackTrace();
}
}

// Set levels on any pre-existing loggers, based on the new properties.
setLevelsOnExistingLoggers();

// Notify any interested parties that our properties have changed.
changes.firePropertyChange(null, null, null);

// Note that we need to reinitialize global handles when
// they are first referenced.
synchronized (this) {
initializedGlobalHandlers = false;
}
}

參考:http://dollyn.iteye.com/blog/539922