Log模块概述

由来

准确的说,Hutool-log只是一个日志的通用门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?下面我列举实践中遇到的一些问题:

已有门面存在问题

  • log对象创建比较复杂很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名
private static final Logger log = LoggerFactory.getLogger(XXX.class);
  • 对于附带Exception参数的方法,并不支持变量。Slf4j中我最喜欢的形式,这样既省去了麻烦的isInfoEnabled()的判断,还避免了拼接字符串:
log.info("我在XXX 改了 {} 变量", "name");

但是这种情况下就无法使用变量模式:

log.error("错误消息", e);

特点

  • Logfactory.get方法不再需要(或者不是必须)传入当前类名,会自定解析当前类名
  • log.xxx方法在传入Exception时同时支持模板语法。
  • 不需要桥接包而自动适配引入的日志框架,在无日志框架下依旧可以完美适配JDK Logging。
  • 引入多个日志框架情况下,可以自定义日志框架输出。

原理

Hutool-log采用动态自动适配模式,它会自动检测引入的日志框架包从而将日志输出到此框架。比如我们在项目中引入Log4j的包,Hutool-log会自动检测到此包的存在,并将日志输出到log4j。如果没有引入任何日志框架,会将日志输出到JDK Logging中。

因此,Hutool-log并没有统一的配置文件,如果你引入任何一种日志框架,使用此框架的配置文件即可。

Hutool-log对于日志框架的监测顺序是:Slf4j(Logback) > Log4j > Log4j2 > Apache Commons Logging > JDK Logging > Console

当然,如果只是引入Slf4j-API,而没有引入任何实现,Slf4j将被跳过。

关于日志框架监测的核心代码请参阅:LogFactory.create

使用

常规使用

Hutool-log的使用与一般日志框架并无区别,调用LogFactory.get()即可简单获取Log实现对象。

Log log = LogFactory.get();
log.debug("This is {} log", Level.DEBUG);
log.info("This is {} log", Level.INFO);
log.warn("This is {} log", Level.WARN);
Exception e = new Exception("test Exception");
log.error(e, "This is {} log", Level.ERROR);

通常我们需要在类中定义日志为private static final Log log = LogFactory.get();以获得更好的性能。

自定义日志实现

有的时候,我们需要自定义日志框架输出,这是我们就需要调用LogFactory.setCurrentLogFactory方法来定义全局的日志实现。

// 自动选择日志实现
Log log = LogFactory.get();
log.debug("This is {} log", "default");
Console.log("----------------------------------------------------------------------");
//自定义日志实现为Apache Commons Logging
LogFactory.setCurrentLogFactory(new ApacheCommonsLogFactory());
log.debug("This is {} log", "custom apache commons logging");
Console.log("----------------------------------------------------------------------");
//自定义日志实现为JDK Logging
LogFactory.setCurrentLogFactory(new JdkLogFactory());
log.info("This is {} log", "custom jdk logging");
Console.log("----------------------------------------------------------------------");
//自定义日志实现为Console Logging
LogFactory.setCurrentLogFactory(new ConsoleLogFactory());
log.info("This is {} log", "custom Console");
Console.log("----------------------------------------------------------------------");

默认的,在未发现任何第三方日志的情况下,检查logging.properties文件是否在classpath中存在(鉴定用户是否想用JDK Logging),如果没有这个配置文件,默认是按照Hutool预定义规则打印到控制台。

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""