前段時間機緣巧合之下,第一次在項目中接觸到了日志這東西,在此之前聽說過但是絲毫沒有意識到它的重要性,恰巧最近在書中看到了關於日志的講解,為了以防日后忘記,在此做一下總結。
基本日志
日志記錄器Logger.global是日志系統中的默認日志記錄器,使用方式看書中的介紹也比較簡單。
Logger.global.setLevel(Level.OFF); //取消記錄所有日志 Logger.global.info("test global"); //記錄日志
setLevel可以設置日志級別,經實踐發現,只會記錄當前設置的級別及以上的日志信息,控制台上打印出了日志記錄,但我的目的是希望日志記錄在log文件中,這樣更便於查看。
經過在網上簡單的檢索后,並沒有找到關於Logger.global默認路徑的信息,只好暫時繼續往下學。
高級日志
public static final Logger logger=Logger.getLogger(Check.class.getName());
個人感覺書中講到這里某些部分就有些一筆帶過的意思,翻譯后的中文閱讀起來也不是很順暢,針對於某些想探索的部分,我再次選擇了網絡檢索。
果然是可以設置日志文件的保存路徑的:
FileHandler fileHandler=new FileHandler("f:/test.log",true); logger.addHandler(fileHandler);
使用到的類是FileHandler類,再將其通過addHandler添加給日志記錄器即可,如果沒有對應的日志文件,將會自動創建文件,第二個參數中的true經實踐發現,如果不設置為true,下一條日志信息將會覆蓋上一條。
然后,將這種方式應用於Logger.global,果然也是一樣管用的。
日志管理器配置
配置文件位於jre/lib/logging.properties,據書中介紹也可以自定義日志文件,但是感覺有點小麻煩,貌似是需要修改配置文件,再以某個命令啟動項目,就不記錄在此了。
簡單記錄幾個配置
.level= INFO//默認日志級別 java.util.logging.ConsoleHandler.level = INFO//控制台日志級別
處理器
可以在控制台上看到日志信息是因為日志記錄器將信息發送給了控制台的日志處理器,這個控制台的日志處理器也可以自定義。
Handler handler = new ConsoleHandler(); handler.setLevel(Level.INFO); logger.addHandler(handler);
FileHandler可以將日志發送到指定文件,而SocketHandler可以將日志發送到指定的主機和端口。
格式化
簡單嘗試了一下,格式化類的對象是需要添加進處理器的。
//簡單打印出了一些日志信息(測試向,視覺效果較差)
public class SelfFormatter extends Formatter { @SneakyThrows @Override public String format(LogRecord record) { Date date = new Date(); date.setTime( record.getMillis()); return "Time:" + date.toString() + "\n" + record.getLevel() + "\n" + record.getMessage() + "\n" + record.getSourceClassName(); } }
測試日志自定義格式化
FileHandler fileHandler = new FileHandler("f:/test.log", true); fileHandler.setFormatter(new SelfFormatter()); logger.addHandler(fileHandler); logger.log(Level.INFO, "test");
寫個小的日志工具類練練手
public final class LogUtil { private LogUtil() { } public static Logger GetLogger(Class<?> clazz, String path) { return GetLogger(clazz, Level.INFO, path, true); } public static Logger GetLogger(Class<?> clazz,Level level, String path) { return GetLogger(clazz, level, path, true); } public static Logger GetLogger(Class<?> clazz, Level level, String path, boolean append) { Logger logger = Logger.getLogger(clazz.getName()); logger.setLevel(level); FileHandler fileHandler = null; try { fileHandler = new FileHandler(path, append); } catch (IOException e) { throw new RuntimeException("創建日志處理器失敗"); } fileHandler.setFormatter(new Formatter() { @Override public String format(LogRecord record) { Date date = new Date(); date.setTime( record.getMillis()); return "\n日志記錄時間:" + date.toString() + "\n" + "日志等級:" + record.getLevel() + "\n" + "日志信息:" + record.getMessage() + "\n" + "全限定類名:" + record.getSourceClassName() + "\n" + "方法名:" + record.getSourceMethodName(); } }); logger.addHandler(fileHandler); return logger; } }