【Logback】如何在项目中快速引入Logback日志?
目录
1、引入相关依赖或者 jar 包
2、使用logback日志
3、引入logback配置文件
4、打印logback内部状态信息
Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快,占用空间更小,而且比其他日志框架提供了更多了功能。
//日志框架出现的历史顺序:log4j --> JUL–> JCL–> slf4j --> logback--> log4j2
1、引入相关依赖或者 jar 包
Logback-classic 模块除了 logback-classic.jar 之外,要求类路径上必须存在 slf4j-api.jar 和 logback-core.jar。//需要多少jar包是官方文档的明确要求,其中slf4j是日志门面,logback是日志门面的一种具体实现
(1)方式一:使用 jar 包方式
为了使用 Logback 日志,需要将以下 jar 添加到类路径中:
For logback 1.3 targeting Java EE (javax.* namespace) //1.3版本-Java EE
logback-core-1.3.13.jar
logback-classic-1.3.13.jar
slf4j-api-2.0.7.jar
For logback 1.4.x targeting Jakarta EE (jakarta.* namespace) //1.4版本-Jakarta EE
logback-core-1.4.13.jar
logback-classic-1.4.13.jar
slf4j-api-2.0.7.jar
logback-*.jar 文件可以从 Maven 中心的 ch.qos.logback groupId 下下载,而 slf4j-api-2.0.7.jar 可以从 org.slf4j groupId 下载。
Java EE 和 Jakarta EE:
2017 年发生了一件重大的事,Oracle 决定将 Java EE 捐赠给 Eclipse 基金会(但 Java 仍然属于 Oracle)。
因为 Oracle 拥有 “Java” 商标权。按照法律要求,Eclipse 基金会需要对 Java EE 进行更名。经过社区的投票选择,Java EE 被更名为 Jakarta EE。
虽然 Oracle 开源了 Java 源代码,但却并未开源所有的文档。同样令人奇怪的是 Eclipse 基金会还不能使用 javax 的命名空间来创建新的 Java 包,但是可以在现有包的下面创建新的类和子类,这就是 jakarta.* namespace 的来源 //感觉挺那个啥啥的
(2)方式二:使用 maven 方式
要在 Maven 项目中使用 logback-classic,只需要在项目的 pom.xml 文件中声明以下依赖项即可。
<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.3.8</version>
</dependency>
但是,logback 不是需要三个包吗?怎么只有一个依赖呢?
这是因为,除了 logback-classic.jar 之外,上述声明还会根据 Maven 的传递性规则自动将 slf4j-api.jar 和 logback-core.jar 拉入你的项目中。
引入相关依赖后(方式一和方式二任意选一种),就可以使用 Logback 日志了,你没有看错,就是这么简单,just do it!!!
2、使用logback日志
现在让我们开始尝试使用 logback:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Example {private static final Logger logger= LoggerFactory.getLogger("self4.Example"); //or Example.classpublic static void main(String[] args) {logger.info("Example log from {}", Example.class.getSimpleName());}
}
输出内容://使用 IntelliJ IDEA,JDK:17.0.9 进行项目构建
11:08:39.641 [main] INFO self4.Example -- Example log from Example
至此,logback 框架就被成功引入到项目中了,这确实是一件非常简单的事,对不对?
注意:从版本 1.3.x 开始,logback 需要 Java 9 来构建。但是,它可以在 Java 8 或更高版本上运行。
不知道你有没有发现,上面的示例没有引用到任何的 logback 的类。Example 类中的 Logger 和 LoggerFactor 都是 slf4j 包中的 API。这是因为在大多数情况下,就日志记录而言,你的类只需要引入 slf4j 的类,所以绝大多数的类将使用 slf4j 的API,并且不会注意到 logback 的存在。//这就好比接口和实现类的情况,在java项目中,我们一般引入的是接口类的对象类型而不是其具体实现类的对象类型
Example 应用程序非常简单,并没有配置任何的配置文件,当 logback 没有找到配置文件时就会执行默认配置策略,logback 会向根记录器(Logger)添加一个默认的 ConsoleAppender。//与Springboot 的思想不谋而合
下边,我们就来引入一个 logback 的配置文件,显示的声明一些配置信息。
3、引入logback配置文件
logback 的配置文件名称为 logback.xml,该文件放置在项目的资源根目录(resources)下即可,简单的配置内容如下:
<configuration><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><root level="debug"><appender-ref ref="STDOUT" /></root>
</configuration>
启动 Example 应用程序,输出内容如下:
13:08:14.919 [main] INFO self4.Example - Example log from Example
logback.xml 配置文件的内容是使用 logback 框架非常重要的一部分,这部分的详细内容,将在后续详细介绍。
4、打印logback内部状态信息
Logback 可以使用内置状态系统跟踪其内部状态的信息。可以通过名为 StatusManager 的组件来访问 logback 生命周期内发生的重要事件。
现在,让我们通过调用 StatusPrinter 类的静态 print() 方法来指示 logback 打印其内部状态。
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Example {private static final Logger logger= LoggerFactory.getLogger("self4.Example");//or Example.classpublic static void main(String[] args) {logger.info("Example log from {}", Example.class.getSimpleName());//打印内部状态信息LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();StatusPrinter.print(lc);}
}
输出信息如下所示:
13:14:37.935 [main] INFO self4.Example - Example log from Example
13:14:37,619 |-INFO in ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.4.14 #1、日志版本信息
13:14:37,651 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] #2、寻找logback-test.xml配置文件
13:14:37,652 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/D:/IDEA_WORKSPACE/demo/demo/target/classes/logback.xml] #3、找到logback.xml配置文件
13:14:37,860 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - Processing appender named [STDOUT] #4、appender附加器信息
13:14:37,861 |-INFO in ch.qos.logback.core.model.processor.AppenderModelHandler - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] #5、附加器类型
13:14:37,877 |-INFO in ch.qos.logback.core.model.processor.ImplicitModelHandler - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property #6、PatternLayoutEncoder类型
13:14:37,930 |-INFO in ch.qos.logback.classic.model.processor.RootLoggerModelHandler - Setting level of ROOT logger to DEBUG #7、日志级别
13:14:37,930 |-INFO in ch.qos.logback.core.model.processor.AppenderRefModelHandler - Attaching appender named [STDOUT] to Logger[ROOT] #8、添加附加器
13:14:37,931 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@11e21d0e - End of configuration. #9、结束配置
13:14:37,932 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@1dd02175 - Registering current configuration as safe fallback point
在上面的示例中,指示 logback 通过调用 StatusPrinter.print() 方法来打印其内部状态。 Logback 的内部状态信息对于诊断与 logback 相关的问题非常有用。
以下是在应用程序中启用日志记录所需的三个步骤://框架使用的基本思路
- 配置 logback 环境,可以通过 logback.xml 文件进行配置。
- 获取 Logger 实例,通过调用 org.slf4j.LoggerFactory 类的 getLogger() 方法(传递当前类名或类本身作为参数)来获取 Logger 实例。
- 使用 Logger 实例,通过调用 Logger 的打印方法(即 debug()、info()、warn() 和 error() 方法)来使用此记录器实例。这将在配置的附加程序上生成日志输出。
有关日志框架的其他信息,这篇文章写得也非常不错,可以进行参考。
logback 的官方文档地址,点击这里。
非常不错的 baeldung 教程,点击这里。
至此,全文结束。
相关文章:
【Logback】如何在项目中快速引入Logback日志?
目录 1、引入相关依赖或者 jar 包 2、使用logback日志 3、引入logback配置文件 4、打印logback内部状态信息 Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快,占用空间更小,而且…...
【Linux从青铜到王者】 基础IO
本篇重点:文件描述符,重定向,缓冲区,磁盘结构,文件系统,inode理解文件的增删查改,查找一个文件为什么一定要有路径,动静态库,有的时候为什么找不到库,动态库的…...
C++之类作用域
目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…...
SpringCloud Gateway网关 全局过滤器[AntPathMatcher 某些路径url禁止访问] 实现用户鉴权
前提:先保证Gateway网关项目 和 Nacos注册中心 等可以正常访问和调用,搭建方法可查看博文SpringCloud Gateway网关 项目创建 及 整合Nacos开发_spring gateway如何设置工程名称-CSDN博客 类似的全局鉴权方案,参考如下: SpringClo…...
ELK介绍以及搭建
基础环境 hostnamectl set-hostname els01 hostnamectl set-hostname els02 hostnamectl set-hostname els03 hostnamectl set-hostname kbased -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config systemctl stop firewalld & systemctl disable firewalld# 安…...
Spring中的ApplicationContext.publishEvent
简单理解 其实就是监听处理。比如找工作平台上,雇主 employer 发布自己的雇佣条件,目的是平台中有符合条件的求职者时,及时向雇主推荐。求职者发布简历,当平台发现某个求职者比较符合条件,就触发被动,推荐…...
jackson、gson、fastjson和json-lib四种主流json解析框架对比
一、四种框架的介绍和对比 在Java中,Jackson、Gson、Fastjson和json-lib都是流行的JSON解析框架,它们各自有一些特点和优势。下面是对它们进行简要介绍和对比: 1.1 介绍 1) Jackson: Jackson是由FasterXML开发的一个高性能的J…...
已解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法
今天在使用 IDEA 使用 MyBatis 的时候遇到了这种情况: 可以看到 userMapper 下有个红色的波浪警告,虽然代码没有任何问题,能正常运行,但是这个红色警告在这里杵着确实让人很窝心。 于是我在网上找了找,最终明白了原因…...
在jar里限制指定的包名才可调用(白名单)。
1. 在jar包中定义一个接口,例如 用于检查传入的hash值是否匹配预设的值。 2. 在调用接口的地方,获取当前应用的hash值。 3. 将当前应用的hash值与预设的值进行比较,如果匹配,则允许调用接口;否则,拒绝调用。…...
python 提取PDF文字
使用pdfplumber,不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…...
电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型
电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型。随着科技的不断发展,数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分,也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…...
C# (WebApi)整合 Swagger
SpringBoot-整合Swagger_jboot整合swagger-CSDN博客 C# webapi 也可以整合Swagger webapi运行其实有个自带的HELP页面 但是如果觉得UI不好看,且没办法显示方法注释等不方便的操作,我们也可以整合Swagger 一、使用NuGet控制台安装Swagger 在菜单中选择…...
导入excel某些数值是0
目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候,展示的字段和内表需要展示的字段不一致,导致显示的是0。 解决 修改展示的字…...
wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片
采用uniapp-vue3实现,透明辉光动画卡片,卡片内容包含标签、标题、副标题、图片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plu…...
Spark: a little summary
转眼写spark一年半了,从之前写机器学习组件、做olap到后面做图计算,一直都是用的spark,惭愧的是没太看过里面的源码。这篇文章的目的是总结一下Spark里面比较重要的point,重点部分会稍微看一下源代码,因为spark是跟cli…...
018—pandas 生成笛卡尔积排列组合合并多列字符串数据
思路: 本需求需要将给定的几列数据,生成一个排列组合形式的数据列,利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下(示例): import pandas as pd2.读入数据 代码如下&…...
【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)
文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,本篇文章就写了一些基础算法…...
bugku3
前女友 md5 进去又是讴歌乱进的东西 源代码 看到code.txt,访问一下 <?php if(isset($_GET[v1]) && isset($_GET[v2]) && isset($_GET[v3])){$v1 $_GET[v1];$v2 $_GET[v2];$v3 $_GET[v3];if($v1 ! $v2 && md5($v1) md5($v2)){if(!strcmp($v3,…...
相机的白平衡
相机的白平衡是指相机根据拍摄环境的光源色温,调整图像中白色看起来应该是白色的功能。白平衡的设置对于确保图像中的颜色准确性非常重要,因为不同光源的色温会使白色看起来有不同的色调。 通常,相机提供了一些预设的白平衡模式,…...
刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现
刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
