Java API 內建的日誌管理,可設定檔路徑,並自動建立不存在的目錄__Java

來源:互聯網
上載者:User

由於項目需要根據日誌來跟蹤瞭解系統資訊,方便查看傳輸資料以及異常資訊,所以打算用log4j來完成這個日誌管理的功能。

可惜的是,在使用中發現log4j在列印異常資訊時,並不能像控制台那樣詳細列印出跟蹤棧StackTrace內的資訊到設定檔指定的記錄檔中去。

可能是我能力有限,網上查了很多資料,嘗試了很多辦法都不行。

後來發現Java API 內建的日誌管理java.util.logging.Logger好像可以滿足要求,於是嘗試了一下,結果如願以償,深感欣慰啊。

關於怎麼使用Java內建的日誌管理,相信網上有很多例子,我就不重複說了。

在這裡我只想說一下,在載入設定檔路徑時,如果路徑不存在,日誌管理類LogManager不會主動建立不存在的目錄,而是報異常如下:

Can't load log handler "java.util.logging.FileHandler"java.io.IOException: Couldn't get lock for C:/iMessengerLogs/log%g.logjava.io.IOException: Couldn't get lock for C:/iMessengerLogs/log%g.logat java.util.logging.FileHandler.openFiles(Unknown Source)at java.util.logging.FileHandler.<init>(Unknown Source)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)at java.lang.reflect.Constructor.newInstance(Unknown Source)at java.lang.Class.newInstance0(Unknown Source)at java.lang.Class.newInstance(Unknown Source)at java.util.logging.LogManager$3.run(Unknown Source)at java.security.AccessController.doPrivileged(Native Method)at java.util.logging.LogManager.loadLoggerHandlers(Unknown Source)at java.util.logging.LogManager.initializeGlobalHandlers(Unknown Source)at java.util.logging.LogManager.access$1100(Unknown Source)at java.util.logging.LogManager$RootLogger.getHandlers(Unknown Source)at java.util.logging.Logger.log(Unknown Source)at java.util.logging.Logger.doLog(Unknown Source)at java.util.logging.Logger.log(Unknown Source)at java.util.logging.Logger.info(Unknown Source)at com.log.LoggerTest.main(LoggerTest.java:13)

所以,在載入配置之前必須先讀取設定檔中記錄檔的目錄,判斷目錄是否存在,如果不存在,則建立目錄。

源碼如下:

1.MyLogManager.java 日誌管理(讀取設定檔,建立目錄,載入設定檔,擷取日誌對象)

package com.log;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Properties;import java.util.logging.LogManager;import java.util.logging.Logger;/** * 日誌管理 *  * @author *  */public class MyLogManager {private static Logger logger;static {InputStream is1 = null;InputStream is2 = null;try {// 讀取設定檔,建立相應的檔案目錄String logFilePath = "";is1 = new FileInputStream("D:\\workspace\\log\\src\\com\\log\\log.properties");Properties properties = new Properties();properties.load(is1);String pattern = properties.getProperty("java.util.logging.FileHandler.pattern");logFilePath = pattern.substring(0, pattern.lastIndexOf("/"));File file = new File(logFilePath);if (!file.exists()) {file.mkdirs();}// 重新初始化日誌屬性並重新讀取日誌配置is2 = new FileInputStream("D:\\workspace\\log\\src\\com\\log\\log.properties");LogManager logManager = LogManager.getLogManager();logManager.readConfiguration(is2);} catch (SecurityException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {is1.close();is2.close();} catch (IOException e) {e.printStackTrace();}}}/** * 擷取日誌對象 *  * @param clazz * @return */public static Logger getLogger(Class<?> clazz) {logger = Logger.getLogger(clazz.getName());return logger;}}

2.log.properties設定檔(帶詳細注釋)

#Level的五個等級SEVERE(最高值) 、WARNING 、INFO 、CONFIG 、FINE 、FINER 、FINEST(最低值)#為 Handler 指定預設的層級(預設為 Level.INFO)。 java.util.logging.ConsoleHandler.level=INFO# 指定要使用的 Formatter 類的名稱(預設為 java.util.logging.SimpleFormatter)。 java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter# 為 Handler 指定預設的層級(預設為 Level.ALL)java.util.logging.FileHandler.level=INFO# 指定要使用的 Formatter 類的名稱(預設為 java.util.logging.XMLFormatter)java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter# 指定要寫入到任意檔案的近似最大量(以位元組為單位),如果該數為0,則沒有限制(預設為無限制)java.util.logging.FileHandler.limit=20480# 指定有多少輸出檔案參與迴圈(預設為 1)。 java.util.logging.FileHandler.count=10# 為產生的輸出檔案名稱指定一個模式。有關細節請參見以下內容(預設為 "%h/java%u.log")# "/" 本地路徑名分隔字元# "%t" 系統臨時目錄 # "%h" "user.home"系統屬性的值 # "%g" 區分迴圈日誌的組建編號 # "%u" 解決衝突的惟一號碼 # "%%" 轉換為單個百分數符號"%"# 如果未指定 "%g"欄位,並且檔案計數大於 1,那麼組建編號將被添加到所組建檔案名末尾的小數點後面 java.util.logging.FileHandler.pattern=C:/testLogs/log%g.log# 指定是否應該將 FileHandler 追加到任何現有檔案上(預設為 false)java.util.logging.FileHandler.append=true# 指定handlerhandlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler

3.LoggerTest.java日誌測試類別

package com.log;import java.io.FileInputStream;import java.util.logging.Level;import java.util.logging.Logger;public class LoggerTest {private static Logger logger = MyLogManager.getLogger(LoggerTest.class);public static void main(String[] args) {try {logger.info("列印資訊");//不存在的路徑String filePath = "C:\\workspace\\log\\src\\com\\log\\log.properties";/** * 會拋出異常: * java.io.FileNotFoundException: C:\workspace\log\src\com\log\log.properties (系統找不到指定的路徑。) */new FileInputStream(filePath);} catch (Exception e) {logger.log(Level.SEVERE, e.getMessage(), e);}}}

4.記錄檔中的異常列印資訊



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.