Java之JDK自带日志

前段时间机缘巧合之下,第一次在项目中接触到了日志这东西,在此之前听说过但是丝毫没有意识到它的重要性,恰巧最近在书中看到了关于日志的讲解,为了以防日后忘记,在此做一下总结。

基本日志

日志记录器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() + " " + record.getLevel() + " " + record.getMessage() + " " + 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 "
日志记录时间:" + date.toString() + "
" +
                        "日志等级:" + record.getLevel() + "
" +
                        "日志信息:" + record.getMessage() + "
" +
                        "全限定类名:" + record.getSourceClassName() + "
" +
                        "方法名:" + record.getSourceMethodName();
            }
        });

        logger.addHandler(fileHandler);
        return logger;
    }
}
原文地址:https://www.cnblogs.com/wxdmw/p/13868061.html