slf4j日志框架和logback详解

 slf4j作用及其实现原理

SLF4J(Simple Logging Facade for Java)是一种日志框架的抽象层,它并不是一个具体的日志实现,而是一个接口或门面(Facade),旨在为各种不同的日志框架提供一个统一的API。以下是SLF4J的作用及其实现原理的详细说明:

SLF4J的作用

统一的日志API:

SLF4J提供了一套通用的API,允许开发人员在代码中使用相同的日志记录方法,无论底层的日志实现是什么。

这样做可以提高代码的可移植性和可维护性,因为更换日志框架只需要改变依赖关系,而不需要修改代码中的日志调用。

避免绑定特定日志框架:

开发人员不必在代码中直接引用特定的日志框架(如Log4j, Logback等),而是通过SLF4J的接口进行日志操作。

这种解耦使得在项目中切换日志框架变得更加容易,减少了依赖锁定的问题。

性能优化:

SLF4J设计时考虑到了性能因素,例如,它提供了条件日志记录功能,只有当日志级别被启用时,才会执行字符串拼接等昂贵的操作。

实现原理

桥接机制:

SLF4J使用桥接器(Bridge)机制将日志调用转发给具体的日志框架实现。

当你引入SLF4J后,还需要添加一个桥接器库,例如slf4j-log4j12或slf4j-logback,这取决于你想要使用的具体日志框架。

静态绑定:

SLF4J通过静态绑定(Static Binding)来决定使用哪个具体的日志框架实现。这意味着在编译时,SLF4J会检查类路径上的可用实现,并选择其中一个。

如果没有找到任何实现,SLF4J会退回到一个简单的实现slf4j-simple,这通常只用于开发和测试环境。

动态绑定:

尽管SLF4J主要使用静态绑定,但在某些情况下,它也支持动态绑定,即在运行时更改日志框架的实现。不过,这通常不推荐,因为它可能会导致不可预测的行为。

日志级别:

SLF4J支持多种日志级别,包括TRACE, DEBUG, INFO, WARN, ERROR,并且可以通过配置文件或编程方式设置每个类或包的日志级别。

通过上述机制,SLF4J能够作为一个轻量级的门面,为Java应用程序提供灵活、高效和统一的日志记录功能。

参考:

https://www.cnblogs.com/xrq730/p/8619156.html

logback详解

Logback 是一个高性能的日志框架,专为 Java 平台设计,由 Ceki Gülcü 创建,他是 Log4j 的作者之一。Logback 作为 Log4j 的继承者,不仅在性能上有所提升,还提供了更强大的配置能力和更好的模块化设计。下面是 Logback 的详细解析:

Logback 的组成部分

Logback 被分为三个模块:

logback-core:这是 Logback 的核心模块,包含了所有基本的日志处理逻辑,如日志事件、日志上下文和日志状态。

logback-classic:构建在 logback-core 上,实现了 SLF4J 的 API,因此可以作为 SLF4J 的后端。同时,它也兼容 Log4j 的 API,为从 Log4j 迁移的应用提供了便利。

logback-access:这是一个可选模块,用于集成 Servlet 容器,可以捕获 HTTP 请求和响应信息,并将其记录到日志中。

Logback 的组件:

Logback 的配置文件(通常是 XML 格式)由以下几种主要组件构成:

Appender:日志消息的目标,可以是控制台、文件、数据库、网络等。常见的 Appender 包括 ConsoleAppender、FileAppender、RollingFileAppender 等。

Layout:定义日志消息的格式。Logback 提供了多种 Layout,如 PatternLayout、XMLLayout 等。

Encoder:在 Logback 1.1 版本之后,Layout 被 Encoder 替代,用于控制日志消息的格式化。PatternLayoutEncoder 是最常用的 Encoder。

Logger:代表一个日志类别,通常与类名或包名对应。每个 Logger 都有一个日志级别,如 TRACE、DEBUG、INFO、WARN、ERROR 等。

Root Logger:是所有 Logger 的父类,如果没有为特定的 Logger 设置日志级别,则会继承 Root Logger 的日志级别。

Filter:用于控制哪些日志事件应该被处理。Filter 可以基于日志级别、日志消息内容等条件过滤日志。

配置示例

见下文配置

性能优化

Logback 在设计时特别关注性能,通过优化日志事件的处理流程和减少对象创建等方式,提高了日志记录的速度。此外,Logback 还支持异步日志记录,进一步提升了高并发场景下的性能表现。

参考:Java日志框架:logback详解 - 五月的仓颉 - 博客园 (cnblogs.com)

SpringBoot配置SLF4J日志全过程

在 Spring Boot 中配置 SLF4J (Simple Logging Facade for Java) 日志的过程通常包括以下几个步骤:

1. 添加依赖

确保你的项目中有 SLF4J 和 Logback 的依赖。Spring Boot 默认会包含这些依赖,但如果你使用的是自定义的配置或者老版本的 Spring Boot,你可能需要在 Maven 或 Gradle 的构建文件中手动添加它们。

Maven 示例:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2. 配置日志级别和输出

Spring Boot 使用 Logback 作为 SLF4J 的默认实现,并且会在类路径下查找 logback.xml 或者 application.properties 文件来配置日志。

使用 logback.xml

创建一个名为 logback.xml 的文件在 src/main/resources 目录下,然后在其中配置日志输出和日志级别。

示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 日志存放路径 --><property name="log.path" value="/Logger/logs" /><!-- 日志输出格式 --><property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" /><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统日志输出 --><appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-info.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>INFO</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_debug" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-debug.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-debug.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>DEBUG</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-error.log</file><!-- 循环政策:基于时间创建日志文件 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 日志文件名格式 --><fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 过滤的级别 --><level>ERROR</level><!-- 匹配时的操作:接收(记录) --><onMatch>ACCEPT</onMatch><!-- 不匹配时的操作:拒绝(不记录) --><onMismatch>DENY</onMismatch></filter></appender><!-- 用户访问日志输出  --><appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}/sys-user.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 按天回滚 daily --><fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern><!-- 日志最大的历史 60天 --><maxHistory>60</maxHistory></rollingPolicy><encoder><pattern>${log.pattern}</pattern></encoder></appender><!-- 系统模块日志级别控制  --><logger name="com.hm" level="info" /><!-- Spring日志级别控制  --><logger name="org.springframework" level="warn" /><root level="info"><appender-ref ref="console" /></root><!--系统操作日志--><root level="info"><appender-ref ref="file_info" /><appender-ref ref="file_error" /><appender-ref ref="file_debug" /></root><!--系统用户操作日志--><logger name="sys-user" level="info"><appender-ref ref="sys-user"/></logger>
</configuration>

 

3. 使用 SLF4J API 记录日志

在你的 Java 类中,使用 SLF4J 的 Logger API 来记录日志。

示例代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class ExampleService {private static final Logger logger = LoggerFactory.getLogger(ExampleService.class);public void doSomething() {logger.info("Doing something...");}
}

4. 测试日志输出

运行你的应用程序并检查控制台输出和日志文件,确认日志是否按照预期被记录。

以上就是 Spring Boot 中配置 SLF4J 日志的全过程。你可以根据实际需求调整日志级别、输出格式和目标位置。

检查项目所在盘的/Logger/logs目录是否有日志文件即可。

参考:

SpringBoot配置SLF4J日志全过程_java_脚本之家

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

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

相关文章

AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程

大家好&#xff0c;我是设计师阿威 想要入门 AI 绘画&#xff0c;首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了&#xff0c;但在那时&#xff0c;生成的图像分辨率和内容都非常抽象。 直到近两年&#xff0c;AI 产出的图像…

防火墙nat基础实验

一&#xff0c;实验拓扑&#xff1a; 二&#xff0c;实验需求&#xff1a; 1&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2&#xff0c;分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的ht…

俄罗斯VK 平台广告投放的注意事项有哪些?

以下是为您制定适合 VK 平台的广告投放策略的一些建议&#xff1a; 市场调研 深入了解俄罗斯市场的需求、趋势和竞争情况。 分析目标受众的兴趣、行为和消费习惯&#xff0c;以确定最有潜力的细分市场。 明确目标 确定具体、可衡量的广告目标&#xff0c;例如增加品牌知名度…

Appium自动化测试系列: 2. 使用Appium启动APP(真机)

历史文章&#xff1a;Appium自动化测试系列: 1. Mac安装配置Appium_mac安装appium-CSDN博客 一、准备工作 1. 安卓测试机打开调试模式&#xff0c;然后使用可以传输数据的数据线连接上你的电脑。注意&#xff1a;你的数据线一定要支持传输数据&#xff0c;有的数据线只支持充…

蔚来汽车:拥抱TiDB,实现数据库性能与稳定性的飞跃

作者&#xff1a; Billdi表弟 原文来源&#xff1a; https://tidb.net/blog/449c3f5b 演讲嘉宾&#xff1a;吴记 蔚来汽车Tidb爱好者 整理编辑&#xff1a;黄漫绅&#xff08;表妹&#xff09;、李仲舒、吴记 本文来自 TiDB 社区合肥站走进蔚来汽车——来自吴记老师的演讲…

java数组之——了解十大排序算法(动画版)

详细的冒泡排序和快速排序请查看文章&#xff1a;java数组之冒泡排序、快速排序-CSDN博客https://blog.csdn.net/weixin_44554794/article/details/140361078 一、插入排序 二、希尔排序 三、选择排序 四、堆排序 五、冒泡排序 六、快速排序 七、归并排序 八、计数排序 九、桶…

【2024_CUMCM】时间序列1

目录 概念 时间序列数据 时期和时点时间序列 数值变换规律 长期趋势T 季节趋势S 循环变动C 不规则变动I 叠加和乘积模型 叠加模型 相互独立 乘积模型 相互影响 注 spss缺失值填补 简单填补 五种填补方法 填补原则 1.随机缺失 2.完全随机缺失 3.非随机缺失…

半小时获得一张ESG入门证书【详细中英文笔记一】

前些日子&#xff0c;有朋友转发了一则小红书的笔记给我&#xff0c; 标题是《半小时获CFI官方高颜值免费证书 ESG认证》。这对考证狂魔的我来说&#xff0c;必然不能错过啊&#xff0c;有免费的羊毛不薅白不薅。 ESG课程的 CFI 官方网址戳这里&#xff1a;CFI 于是信心满满的…

「iOS」暑假第一周 —— ZARA的仿写

暑假第一周 ZARA的仿写 文章目录 暑假第一周 ZARA的仿写写在前面viewDidLoad 之中的优先级添加自定义字体下载想要的字体添加至info之中找到字体名字并应用 添加应用图标和启动页面 写在前面 暑假第一周留校学习&#xff0c;对于ZARA进行了仿写&#xff0c;在仿写的过程之中&a…

qt 设置自定义控件的内边距

1.qt 设置自定义控件的内边距 在 Qt 中&#xff0c;如果你想要设置自定义控件的内边距&#xff0c;你可以通过几种方式来实现。这主要取决于你的自定义控件是如何实现的&#xff0c;以及你希望内边距如何影响控件的布局和绘制。以下是一些常见的方法&#xff1a; 使用样式表&a…

护网HW面试常问——webshell内存马流量特征以及查杀

参考&#xff1a;学习干货|HVV必学远控工具及Webshell流量合集分析(建议收藏附面试题) 蚁剑 ini_set ini_set_time ini_set_limit ini_set("display_errors","0") 部分代码明文传输&#xff0c;较好辨认 哥斯拉 1、User-Agent (弱特征) 在默认的情况…

【坑】微信小程序开发wx.uploadFile和wx.request的返回值格式不同

微信小程序 使用wx.request&#xff0c;返回值是json&#xff0c;如下 {code:200,msg:"更新用户基本信息成功",data:[]} 因此可以直接使用如 res.data.code获取到返回值中的code字段 但是&#xff0c;上传图片需要使用wx.uploadFile&#xff0c;返回的结果如下 …

Hive表【汇总】

提前必备 1、内部表和外部表的区别 概念讲解&#xff1a; 外部表&#xff1a;1、存放他人给予自己的数据2、当我们删除表操作时&#xff0c;会将表的元数据删除&#xff0c;保留数据文件 内部表&#xff1a;1、存放已有的数据2、当我们删除表操作时&#xff0c;会将表的元数据…

CCNA-2-V7-模块7–9:可用且可靠的网络考试答案

1.一台启用了DHCP的客户端PC刚刚启动。客户端PC在与DHCP服务器通信时,将在哪两个步骤中使用广播消息?(选两个。) DHCPDISCOVERDHCPACKDHCPOFFERDHCPREQUESTDHCPNAK 2.管理员发出命令:管理员想达到什么目的? Router(config)# interface g0/1 Router(config-if)# ip address …

Java中标识符和关键字

1.标识符 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} }上述代码中在public class 后面的HelloWorld称为类名&#xff0c;main称为方法名&#xff0c;也可以将其称为标识符&#xff0c;即&#xff1a;在程…

算法学习day12(动态规划)

一、不同的二叉搜索树 二叉搜索树的性质&#xff1a;父节点比左边的孩子节点都大&#xff1b;比右边的孩子节点都小&#xff1b; 由图片可知&#xff0c;dp[3]是可以由dp[2]和dp[1]得出来的。(二叉搜索树的种类和根节点的val有关) 当val为1时&#xff0c;左边是一定没有节点的…

qt 创建一个包含两按钮的自定义控件,且按钮和自定义控件间没有间距

在Qt中创建一个包含两个按钮的自定义控件&#xff0c;并确保按钮与自定义控件之间没有间距&#xff0c;可以通过继承QWidget并手动布局按钮来实现。以下是一个简单的示例代码&#xff0c;展示了如何创建一个这样的自定义控件&#xff1a; #include <QWidget> #include &…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

Databricks Layer

前言 Databricks 中的 Bronze-Silver-Gold 层级是数据湖架构中数据组织和处理的一种方法&#xff0c;它允许数据从原始状态逐步转化为对业务决策有用的形式。这种分层方法有助于数据的可管理性、可扩展性和可维护性&#xff0c;同时也支持数据的快速摄取和灵活的分析需求。Dat…

illustrator免费插件功能强大脚本大集合300多款开发必备可收藏无需下载可直接运行ai设计印刷开发都可用

宝贝名称&#xff1a;TB48 ai悟空插件开发神器脚本仓库300多个脚本开发参考 测试版本&#xff1a;AI CC2018-2020-2021-2022-2023-2024 系统支持&#xff1a;windows系统 标签&#xff1a;Ai插件开发图片插画平面设计印刷打印图标矢量 加企鹅群可自动获取。功能不定时更新