当前位置: 首页 > news >正文

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_脚本之家

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++入门基础(2)
  • 论文翻译:Rethinking Interpretability in the Era of Large Language Models
  • 设计模式使用场景实现示例及优缺点(行为型模式——策略模式)
  • leetcode 147. 对链表进行插入排序
  • Kafka基础入门-代码实操
  • 易懂的吉文斯(Givens)变换(一)
  • 如何使用Gunicorn配置SSL/TLS加密Web服务
  • 序列化与反序列化及不同序列化方式的性能对比
  • 第四章 Redis(2023版本IDEA)
  • SVN 分支管理深入解析
  • 机器人三定律及伦理分析
  • 通过 PPPOE 将 linux 服务器作为本地局域网 IPv4 外网网关
  • Zookeeper-数据结构
  • 优化Cocos Creator 包体体积
  • IDEA启动Web项目总是提示端口占用
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Cumulo 的 ClojureScript 模块已经成型
  • EOS是什么
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • Spring声明式事务管理之一:五大属性分析
  • vue:响应原理
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用SAX解析XML
  • 思否第一天
  • 小试R空间处理新库sf
  • 正则表达式小结
  • UI设计初学者应该如何入门?
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​configparser --- 配置文件解析器​
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (libusb) usb口自动刷新
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (阿里云万网)-域名注册购买实名流程
  • (超详细)语音信号处理之特征提取
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)Scala的“=”符号简介
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转)用.Net的File控件上传文件的解决方案
  • ./configure,make,make install的作用
  • .ai域名是什么后缀?
  • .NET Core跨平台微服务学习资源
  • .NET Reactor简单使用教程
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET开发不可不知、不可不用的辅助类(一)
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)