秉承着某種執念我今天決定不用Logback而是和Java的logging肛到底,如今總結一下研究成果:java
日誌等級有七種,severe,warning,info,fine,finer,finest,config,這七種都可以做爲方法名,且是枚舉類Level中的枚舉量。使用方法很簡單,相似logger.info(String msg)的形式便可使用,可是接下來有一個比較坑的地方:默認只能打印info,warning,severe這三個等級的日誌,若是你想用更低等級的日誌,好比說debug時看信息,就要進行復雜的配置。debug
若是你僅僅將日誌輸出到文件而不須要使用控制檯,則比較容易,直接使用setLevel方法便可。可是,若是你想使用控制檯,就要知道,日誌可否顯示在控制檯不只取決於它這個級別可否被打印,還取決於全局Logger配置中是否容許這個級別的日誌顯示在控制檯。因此,想在控制檯中查看低等級日誌,則須要手動改寫loggerManager的配置類。日誌
java8之前的全局配置文件在jre/lib中,從java9開始挪到了jre/conf中,可是我極不推薦你更改這裏的配置,我這裏建議你對其進行單獨加載,僅對你的應用生效。這裏給出Springboot加載全局日誌配置文件的方法,我將自定義的配置文件放在了/resources/logging.propertiescode
@Component public class LogConfig { @PostConstruct public void setLogManager(){ LogManager logManager = LogManager.getLogManager(); try { logManager.readConfiguration(new ClassPathResource("logging.properties").getInputStream()); } catch (Exception e) { //添加你方便的顯示錯誤的方式。 } } }
這裏我使用了Spring提供的ClassPathResource類,這個類十分方便,能夠直接指向resources默認目錄,並提供了轉換成文件/IO流等多種方案方便你的類對其進行讀取。另外logManager是一個單例,一旦更改配置全局的Log都會加載你的自定義配置。就不要吐槽我爲何要在Springboot裏用java本身的日誌類了,因爲項目是多個項目合併而來的。這裏不用ClassPathResource類也有不少方法去讀,好比用文件操做,再也不敘述。orm
以後,咱們就能夠在對應目錄編寫配置文件了:內存
#handler handlers= java.util.logging.ConsoleHandler #全局日誌等級 .level= INFO #輸出日誌文件名格式 java.util.logging.FileHandler.pattern = %h/java%u.log #日誌文件長度限制 java.util.logging.FileHandler.limit = 50000 #日誌數目 java.util.logging.FileHandler.count = 1 #鎖的數量 java.util.logging.FileHandler.maxLocks = 100 #日誌默認形式 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter #控制檯顯示的日誌等級 java.util.logging.ConsoleHandler.level = FINE #選擇日誌輸出格式 java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter #對格式進行自定義 java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] [%4$-7s] %5$s %n #對特殊類的等級特殊說明 com.changhe.Utils.LogUtils.level=FINE
好比這裏,我未設置handler,設置了全局顯示INFO級,個人Debug用logger顯示到Fine級(方法是將以該類類名爲名的logger的等級設爲FINE,參考代碼),並容許控制檯輸出Fine級消息,並自定義了日誌輸出格式,有關於格式定義的寫法,能夠去查閱Java的Formatter類,這種寫法經常使用於定義時間格式等,較爲複雜。get
最後提供一下我寫的餓漢模式的日誌類單例,考慮到日誌要記錄類名,這種方式並不真的很適合,但這裏因爲我寫的這個logger只負責自定義輸出,因此能夠採用這種方便且減小內存消耗的作法:it
import java.util.logging.*; public class LogUtils { private static LogUtils logUtils = new LogUtils(); public static LogUtils getLogUtils() { return logUtils; } private Logger logger; private LogUtils() { logger = Logger.getLogger(LogUtils.class.getName()); } public Logger getLogger() { return logger; } }