Hutool - Log:自动识别日志实现的日志门面

一、简介

在 Java 开发中,日志记录是一项非常重要的功能,它可以帮助开发者在开发和生产环境中监控程序的运行状态、排查问题。然而,Java 生态系统中有多种日志实现框架,如 Log4j、Logback、JDK 自带的日志框架等。为了在不同的项目中灵活切换日志实现,同时避免代码与具体的日志框架耦合,日志门面(Logging Facade)应运而生。Hutool - Log 就是一个自动识别日志实现的日志门面,它提供了统一的日志记录接口,能够自动检测项目中使用的日志实现框架,并将日志记录操作委托给相应的实现。

二、引入依赖

如果你使用 Maven 项目,在 pom.xml 中添加以下依赖:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>

若使用 Gradle 项目,在 build.gradle 中添加:

implementation 'cn.hutool:hutool-all:5.8.16'
三、自动识别日志实现原理

Hutool - Log 在运行时会按照一定的顺序检测项目中是否存在常见的日志实现框架,检测顺序如下:

  1. Logback
  2. Log4j 2
  3. Log4j
  4. JDK Logging

当检测到某个日志实现框架存在时,Hutool - Log 会自动使用该框架进行日志记录。如果没有检测到任何日志实现框架,Hutool - Log 会默认使用 JDK 自带的日志框架。

四、基本使用示例
1. 获取日志对象
import cn.hutool.log.StaticLog;public class LogExample {public static void main(String[] args) {// 获取日志对象cn.hutool.log.Log log = StaticLog.get();// 记录不同级别的日志log.trace("这是一条 trace 级别的日志");log.debug("这是一条 debug 级别的日志");log.info("这是一条 info 级别的日志");log.warn("这是一条 warn 级别的日志");log.error("这是一条 error 级别的日志");}
}

在上述代码中,使用 StaticLog.get() 方法获取日志对象。StaticLog 是 Hutool - Log 提供的一个静态工具类,方便在代码中获取日志对象。然后,使用日志对象的不同方法记录不同级别的日志,如 tracedebuginfowarnerror

2. 指定类名获取日志对象
import cn.hutool.log.StaticLog;public class LogWithClassNameExample {public static void main(String[] args) {// 指定类名获取日志对象cn.hutool.log.Log log = StaticLog.get(LogWithClassNameExample.class);log.info("使用指定类名获取的日志对象记录信息");}
}

通过 StaticLog.get(Class<?> clazz) 方法可以指定类名获取日志对象,这样在日志记录中可以清晰地看到日志所属的类。

五、日志级别控制

不同的日志实现框架都支持日志级别的控制,通过配置文件可以设置不同级别的日志是否输出。以下是几种常见日志实现框架的配置示例:

1. Logback 配置

src/main/resources 目录下创建 logback.xml 文件,内容如下:

<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="STDOUT" /></root>
</configuration>

在这个配置中,将根日志级别设置为 info,表示只输出 info 及以上级别的日志。

2. Log4j 2 配置

src/main/resources 目录下创建 log4j2.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/></Console></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

同样,将根日志级别设置为 info,只输出 info 及以上级别的日志。

六、异常日志记录

在程序中捕获异常并记录异常信息是很常见的操作,Hutool - Log 提供了方便的方法来记录异常日志。

import cn.hutool.log.StaticLog;public class ExceptionLogExample {public static void main(String[] args) {cn.hutool.log.Log log = StaticLog.get();try {int result = 1 / 0;} catch (ArithmeticException e) {log.error("发生算术异常", e);}}
}

在上述代码中,捕获 ArithmeticException 异常,并使用 log.error 方法记录异常信息,第二个参数传入异常对象,这样可以在日志中看到详细的异常堆栈信息。

七、注意事项
  • 日志框架依赖:要确保项目中引入了相应的日志实现框架依赖,否则 Hutool - Log 会默认使用 JDK 自带的日志框架。例如,如果要使用 Logback,需要在 pom.xml 中添加以下依赖:
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.11</version>
</dependency>
  • 配置文件位置:不同的日志实现框架的配置文件位置和格式可能不同,要确保配置文件正确放置在 src/main/resources 目录下,并且格式正确,才能生效。
  • 性能考虑:日志记录会对程序的性能产生一定的影响,尤其是在高并发场景下。因此,要合理设置日志级别,避免记录过多不必要的日志信息。

通过使用 Hutool - Log,开发者可以在不关心具体日志实现框架的情况下,方便地进行日志记录,提高开发效率,同时保持代码的灵活性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

伪404兼容huawei生效显示404

根据上述思考&#xff0c;以下是详细的中文分步说明&#xff1a; --- **步骤 1&#xff1a;获取目标设备的User-Agent信息** 首先&#xff0c;我们需要收集目标设备的User-Agent字符串&#xff0c;包括&#xff1a; 1. **iPhone设备的User-Agent**&#xff1a; Mozi…

github配置sshkey

使用命令生成sshkey ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 依此会要求输入以下信息&#xff0c;可以使用默认值 设置保存密钥的路径 设置SSH密钥密码&#xff08;备注&#xff1a;空内容表示不设置SSH密钥密码&#xff09; 再次确认SSH密钥密…

深入理解WebSocket接口:如何使用C++实现行情接口

在现代网络应用中&#xff0c;实时数据传输变得越来越重要。通过WebSocket&#xff0c;我们可以建立一个持久连接&#xff0c;让服务器和客户端之间进行双向通信。这种技术不仅可以提供更快的响应速度&#xff0c;还可以减少不必要的网络流量。本文将详细介绍如何使用C来实现We…

FFMPEG编码容错处理解决办法之途径----升级库文件

在qt开发环境下接收网络数据&#xff0c;调用ffmpeg解码播放视频&#xff0c;出现闪屏现象&#xff0c;具体现象可以使用操作系统自带的ffplay播放器播放原始视频流可复现&#xff1b;而使用操作系统自带的mpv播放器播放视频则不会出现闪屏&#xff1b;闪屏时会报Could not fin…

什么是超越编程(逾编程)(元编程?)

超越编程(逾编程)(元编程&#xff1f;)(meta-programming) 目录 1. meta- 的词源 2. 逾编程(meta-programming) 的直实含义 2.1 定义 2.2 说明 3. 翻译成“元编程”应该是一种错误 1. meta- 的词源 这是一个源自希腊语的构词元素&#xff0c;其有三种含义&#xff…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用&#xff0c;本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据&#xff1a; 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

新版Tomcat MySQL IDEA 安装配置过程遇到的问题

一、IDEA闪退 打不开了 IDEA环境变量路径不对 二、Tomcat 一闪而过 主要是JDK环境变量不对 三、MySQL 重新安装、是否备份以及默认盘问题 看清楚教程基本没问题&#xff1a;Windows 安装配置及卸载MySQL8超详细保姆级教程_mysql8卸载-CSDN博客

链表_两两交换链表中的节点

链表_两两交换链表中的节点 一、leetcode-24二、题解1.引库2.代码 一、leetcode-24 两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能…

DAY08 List接口、Collections接口、Set接口

学习目标 能够说出List集合特点1.有序2.允许存储重复的元素3.有带索引的方法(练习 add,remove,set,get) 能够使用集合工具类Collections类:static void sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。static <T> void sort(List<T> lis…

Zookeeper(58)如何在Zookeeper中实现分布式锁?

在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务&#xff0c;使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例&#xff0c;展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…

后台管理系统-项目初始化

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最常见的应用模式,不同的管理系统之间有很多相似的地方…

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…

VLM(视觉语言模型)与DeepSeek R1(奖励机制)如何结合

VLM&#xff08;视觉语言模型&#xff09;与DeepSeek R1&#xff08;奖励机制&#xff09;如何结合 flyfish VLM的传统训练依赖于监督学习&#xff08;直接拟合问答对&#xff09;&#xff0c;而规则奖励函数通常用于强化学习&#xff08;通过试错和奖励反馈优化策略&#xf…

从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则

从零开始构建一个语言模型就要设计一个模型框架,其中要配置很多参数。在自然语言处理任务中,vocab_size(词汇表大小) 的设定是模型设计的关键参数之一,它直接影响模型的输入输出结构、计算效率和内存消耗。 本文是在我前文的基础上讲解的:从零开始构建一个小型字符级语言…

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

实时股票行情接口与WebSocket行情接口的应用

实时股票行情接口与WebSocket行情接口的应用 实时股票行情接口是量化交易和投资决策的核心工具之一&#xff0c;行情接口的种类和功能也在不断扩展。介绍几种常见的行情接口&#xff0c;包括实时股票行情接口、Level2行情接口、WebSocket行情接口以及量化行情接口&#xff0c;…

图论 之 BFS

文章目录 3243.新增道路查询后的最短距离1311.获取你好友已观看的视频 BFS:广度优先搜索&#xff08;BFS&#xff09; 是一种常用的算法&#xff0c;通常用于解决图或树的遍历问题&#xff0c;尤其是寻找最短路径或层级遍历的场景。BFS 的核心思想是使用队列&#xff08;FIFO 数…

ollama stream“:True django如何返回数据

在使用 Django 框架开发 Web 应用时&#xff0c;如果你想要通过 Ollama 流式返回数据&#xff0c;你可以通过 Django 的 HttpResponse 或者 StreamingHttpResponse 来实现。Ollama 主要用于处理文本生成任务&#xff0c;如聊天机器人、自动完成等&#xff0c;通常这些任务会产生…

为什么要用 const 和 let,而不是 var?

JavaScript 中有三种方式声明变量&#xff1a;var、let 和 const。其中&#xff0c;var 是早期版本的 JavaScript 中的标准&#xff0c;但随着 ECMAScript 6&#xff08;ES6&#xff09;引入了 let 和 const&#xff0c;var 的种种问题也显现出来。今天&#xff0c;我们将探讨为…