首页 > 其他分享 >关于Hutool Log的一些想法

关于Hutool Log的一些想法

时间:2023-12-27 21:22:43浏览次数:32  
标签:log 框架 Hutool 想法 Slf4j 引入 日志 Log

在众多的 Java 日志工具中,Log4j 是最先被广泛使用的,目前流行的是带有 Logback 的 SLF4J。开发人员有时需要将一些组件封装到应用程序中,因此无法保证所有组件都使用指定的日志记录工具。此外,应用程序可能会使用许多使用不同日志记录工具的第三方包。例如,如果应用程序有两个使用不同日志记录工具的组件,则应用程序将同时从两个日志记录工具输出日志,从而导致日志记录变得复杂。

  • 作为一个大而全的工具库,Hutool自然也有自己的日志门面,功能类似于Slf4j。既然像Slf4j这种门面框架已经非常完善,为何还要自己做一个门面呢?
  1. log对象创建比较复杂
    很多时候我们为了在类中加日志不得不写一行,而且还要去手动改XXX这个类名
private static final Logger log = LoggerFactory.getLogger(XXX.class);
  1. 对于附带Exception参数的方法,并不支持变量。
    Slf4j中的形式,这样既省去了麻烦的isInfoEnabled()的判断,还避免了拼接字符串:
log.info("我在XXX 改了 {} 变量", "name");

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

log.error("错误消息", e);
  • 因此,Hutool-log被设计成具有如下特点的日志门面:
  1. Logfactory.get方法不再需要(或者不是必须)传入当前类名,会自动解析当前类名
  2. log.xxx方法在传入Exception时同时支持模板语法。
  3. 不需要桥接包而自动适配引入的日志框架,在无日志框架下依旧可以完美适配JDK Logging。
  4. 引入多个日志框架情况下,可以自定义日志框架输出。

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将被跳过。

  • 但是个人认为Hutool-log的日志等级仍然存在缺失,作为一个通用的日志门面,日志的等级应该足够的全,才能够满足对各日志系统的覆盖。
    JUL中的Config等级以及Fatal等级是很有必要被引入设计中的。
    CONFIG级别用于记录有关系统配置和参数的信息。它通常用于记录应用程序启动时的配置信息,例如数据库连接信息、环境变量、配置文件的加载等。这些信息对于调试和排除问题非常有帮助,它们提供了应用程序运行时的关键设置和环境细节。可以在需要时启用或禁用CONFIG级别的日志记录,从而获取程序的运行时信息。
    FATAL是最高级别的日志级别,用于记录严重的错误和异常情况。当应用程序遇到无法继续执行的错误时,FATAL级别的日志信息通常包含异常堆栈跟踪,以帮助开发人员确定问题的根本原因。级别的日志记录是必要的。这些错误可能会导致应用程序崩溃或无法正常工作,因此需要尽快发现和处理。

同时Hutool-log并不需要担心受到Slf4j漏洞的影响(当然也包括其他日志框架)
Hutool并不直接依赖对应的日志框架,而只是在编译的时候需要,并不会保有存在漏洞的代码,只有在实际运行中引入了相关版本的Slf4j,才会导致出现问题。然而此时的关键问题似乎变成了被引入的日志库的了。

标签:log,框架,Hutool,想法,Slf4j,引入,日志,Log
From: https://www.cnblogs.com/byha/p/17931454.html

相关文章

  • verilog代码中为什么要加`default_nettype none
    在Verilog中,default_nettypenone语句用于禁止隐式声明信号类型,这样可以增强代码的可读性和可维护性。Verilog语言允许在使用信号之前不显式声明信号类型,而是根据信号名的前缀来推断信号的类型(比如wire或reg)。然而,这种隐式声明的方式可能会导致一些问题,特别是在大型项目或多人协......
  • 贪吃蛇login.js代码
    // pages/login/login.jsPage({  /**   * 页面的初始数据   */  data: {    username:"",    password:"",  },  usernameinput(e){    this.setData({      username:e.detail.value    })  },  passwordinput(e){    this.setDat......
  • python之日志logging
    转载:https://blog.csdn.net/weixin_43790276/article/details/101944628 logging模块是Python内置的标准模块,用于输出代码日志。一、logging模块简介在工作中,运行的代码量是非常大的,为了更方便的管理代码运行,监控代码运行的过程,需要在代码中添加一些必要的日志输出。Py......
  • Multivariate Function in Mathematics Education: 30 Engaging Blog Posts for Teach
    1.背景介绍在数学教育领域,多变量函数是一个非常重要的概念。它们在许多实际应用中发挥着关键作用,例如经济学、生物学、物理学等领域。然而,在教育中,多变量函数的教学和学习往往受到一些挑战。这篇博客文章将探讨如何通过30个有趣的博客帖子来提高多变量函数在数学教育中的教学质量。......
  • NDK-以十六进制字符串的形式打印char[]数组到logcat
    NDK-以十六进制字符串的形式打印char[]数组到logcat1.在Java中打印publicstaticStringconvertByteArr2String(byte[]bArr){StringBuilderbuilder=newStringBuilder();for(inti=0;i<bArr.length;i++){builder.append(String.format(Locale......
  • 常见verilog与电路的匹配
    1、D触发器modulertl(inputclk,inputrst_n,inputd,outputregq);always@(posedgeclkornegedgerst_n)beginif(!rst_n)q<='b0;elseq<=d;endendmodule 2、ifelse选择mod......
  • FPGA学习笔记---verilog学习(2)--过程块always@(*)
    在Verilog中always@(*)语句的意思是always模块中的任何一个输入信号或电平发生变化时,该语句下方的模块将被执行。1、always语句有两种触发方式。第一种是电平触发,例如always@(aorborc),a、b、c均为变量,当其中一个发生变化时,下方的语句将被执行。2、第二种是沿触发,例如always......
  • logstash抽取clickhouse数据库偶现网络错误异常并提示FORMAT TabSeparatedWithNamesAn
     如上图错误信息所示,可以看到第一次sql查询是正常的,在第二次offset偏移的时候报了网络错误。起初的想法就是clickhouse的问题,把sql粘贴出来放入clickHouse中单独执行发现sql并无问题。然后又认为是logstash的问题并分别下载了logstash-7.3.1、logstash-7.17.15、logstash-8.11.......
  • Java:hutool工具箱实现文件大小的友好输出
    文档https://doc.hutool.cn/基本使用依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.22</version></dependency>示例packagecom.example.demo;importorg......
  • LiveGBS流媒体平台GB/T28181常见问题-配置国标流媒体服务日志文件个数及记录时长配置l
    LiveGBS流媒体平台GB/T28181常见问题-如何配置国标流媒体服务日志文件个数及记录时长1、日志文件2、配置日志文件个数及记录时间3、配置日志文件路径4、相关问题4.1、如何关闭信令日志?5、搭建GB28181视频直播平台1、日志文件部署LiveGBS后,LiveCMS和LiveSMS的解压目录下都个l......