• java.util.logging的使用


    秉承着某种执念我今天决定不用Logback而是和Java的logging肛到底,现在总结一下研究成果:

    日志等级

    日志等级有七种,severe,warning,info,fine,finer,finest,config,这七种均可以作为方法名,且是枚举类Level中的枚举量。使用方法很简单,类似logger.info(String msg)的形式即可使用,但是接下来有一个比较坑的地方:默认只能打印info,warning,severe这三个等级的日志,如果你想用更低等级的日志,比如说debug时看信息,就要进行复杂的配置。

    如果你仅仅将日志输出到文件而不需要使用控制台,则比较容易,直接使用setLevel方法即可。但是,如果你想使用控制台,就要知道,日志能否显示在控制台不仅取决于它这个级别能否被打印,还取决于全局Logger配置中是否允许这个级别的日志显示在控制台。所以,想在控制台中查看低等级日志,则需要手动改写loggerManager的配置类。

    加载配置文件

    java8以前的全局配置文件在jre/lib中,从java9开始挪到了jre/conf中,但是我极不推荐你更改这里的配置,我这里建议你对其进行单独加载,仅对你的应用生效。这里给出Springboot加载全局日志配置文件的方法,我将自定义的配置文件放在了/resources/logging.properties

    @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类也有很多方法去读,比如用文件操作,不再叙述。

    配置文件

    之后,我们就可以在对应目录编写配置文件了:

    #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类,这种写法常用于定义时间格式等,较为复杂。

    一个单例模式的logger获取方式

    最后提供一下我写的饿汉模式的日志类单例,考虑到日志要记录类名,这种方式并不真的很适合,但这里由于我写的这个logger只负责自定义输出,所以可以采用这种方便且减少内存消耗的做法:

    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;
        }
    }
    
    
  • 相关阅读:
    CodeForces 52B Right Triangles 矩阵上的计数
    电影节
    怎样高速生成随机数
    VS2010版快捷键
    两个下拉框选择后取出这两个框的区间值
    vs操作快捷键
    输入框限制,条件是左边输入框输入的数字要小于右边输入框的值,两边输入框要为整型数字。
    DateTime.Parse
    清空文本输入框的值
    sql 随机函数newid()
  • 原文地址:https://www.cnblogs.com/cielosun/p/8836451.html
Copyright © 2020-2023  润新知