秉承着某种执念我今天决定不用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; } }