java.util.logging的使用

秉承着某种执念我今天决定不用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获取方式

最后提供一下我写的饿汉模式的日志类单例,考虑到日志要记录类名,这种方式并不真的很适合,但这里因为我写的这个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;
    }
}
相关文章
相关标签/搜索