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

SLF4J框架原理及其实现方案

slf4j 是一个日志规范框架;基本上所有的 JAVA 日志都要实现这个规范;比如:Logbacklog4jlog4j2;本文档记载如何实现 slf4j 规范;实现自己的日志框架;

slf4j 分为两个部分,其中包含 :1.7.x 及其以前的版本、1.7.x 以后的版本;之所以这么说;是因为他们区分注册方式,前面的版本使用固定的类路径进行注册,后面版本使用 JAVA SPI 进行注册

1. 重写日志实现

实现日志打印类,包含了日志输出的逻辑方法:

package com.maple.logger;import org.slf4j.Logger;import java.io.Serializable;public final class MapleLogger implements Logger, Serializable {private final String loggerName;public MapleLogger(String loggerName) {this.loggerName = loggerName;}@Overridepublic String getName() {return this.loggerName;}
}

实现日志打印类获取工厂:

package com.maple.logger;import org.slf4j.ILoggerFactory;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;public class MapleLoggerFactory implements ILoggerFactory {private final ConcurrentMap<String, MapleLogger> loggerMap = new ConcurrentHashMap<>();@Overridepublic MapleLogger getLogger(String name) {MapleLogger logger = loggerMap.get(name);if (logger != null) {return logger;} else {MapleLogger newInstance = new MapleLogger(name);MapleLogger oldInstance = loggerMap.putIfAbsent(name, newInstance);return oldInstance == null ? newInstance : oldInstance;}}
}

2. 日志绑定

这里才是不同版本的区别,负责把日志框架绑定到运行的程序上下文中:

首先说 1.7.x 之前的版本绑定方法:

创建一个绑定类,用于返回日志工厂实力,但是此类路径必须固定死为 org.slf4j.impl.StaticLoggerBinder 如果不是这个全限定名,则无法进行绑定

package org.slf4j.impl;import com.maple.logger.MapleLoggerFactory;
import org.slf4j.ILoggerFactory;public class StaticLoggerBinder implements org.slf4j.spi.LoggerFactoryBinder {private static StaticLoggerBinder SINGLETON = new StaticLoggerBinder();public static String REQUESTED_API_VERSION = "1.0";private static final String loggerFactoryClassStr = MapleLoggerFactory.class.getName();private final ILoggerFactory loggerFactory;private StaticLoggerBinder() {loggerFactory = new MapleLoggerFactory();}@Overridepublic ILoggerFactory getLoggerFactory() {return loggerFactory;}@Overridepublic String getLoggerFactoryClassStr() {return loggerFactoryClassStr;}public static StaticLoggerBinder getSingleton() {return SINGLETON;}
}

再说 1.7.x 之后的版本绑定方法:

这里采用 SPI 方式进行加载日志绑定类,首先创建日志绑定类:

package com.maple.logger;import org.slf4j.ILoggerFactory;
import org.slf4j.IMarkerFactory;
import org.slf4j.helpers.BasicMDCAdapter;
import org.slf4j.helpers.BasicMarkerFactory;
import org.slf4j.spi.MDCAdapter;
import org.slf4j.spi.SLF4JServiceProvider;public class MapleSLF4JServiceProvider implements SLF4JServiceProvider {public static String REQUESTED_API_VERSION = "2.0.16";private ILoggerFactory loggerFactory;private IMarkerFactory markerFactory;           // 可以根据自己需求进行重写private MDCAdapter mdcAdapter;                  // 可以根据自己需求进行重写@Overridepublic void initialize() {loggerFactory = new MapleLoggerFactory();markerFactory = new BasicMarkerFactory();mdcAdapter = new BasicMDCAdapter();}@Overridepublic ILoggerFactory getLoggerFactory() {return loggerFactory;}@Overridepublic IMarkerFactory getMarkerFactory() {return markerFactory;}@Overridepublic MDCAdapter getMDCAdapter() {return mdcAdapter;}@Overridepublic String getRequestedApiVersion() {return REQUESTED_API_VERSION;}
}

然后添加 SPI 文件,在 resources/META-INF/services 下创建 org.slf4j.spi.SLF4JServiceProvider 文件,文件内容即上面方法的全限定名

相关文章:

SLF4J框架原理及其实现方案

slf4j 是一个日志规范框架&#xff1b;基本上所有的 JAVA 日志都要实现这个规范&#xff1b;比如&#xff1a;Logback、log4j、log4j2&#xff1b;本文档记载如何实现 slf4j 规范&#xff1b;实现自己的日志框架&#xff1b; slf4j 分为两个部分&#xff0c;其中包含 &#xf…...

代码随想录-算法训练营-番外(图论01:图论理论基础,所有可到达的路径)

day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercarl.com/kamacoder/图论理论基础.html#图的基本概念 day01 所有可达路径 邻接矩阵 import java.util.Scanner;import java.util.List;import java.util.ArrayL…...

【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统

在企业管理中&#xff0c;企业资源规划&#xff08;ERP&#xff09;系统是不可或缺的工具。它能够帮助企业高效管理各种资源&#xff0c;包括人力资源、财务资源和库存等。Java作为一种成熟的编程语言&#xff0c;因其跨平台特性、强大的生态系统以及良好的社区支持&#xff0c…...

springboot配置过滤器解决html资源路径和接口路径冲突问题

比如&#xff1a; html文件使用 / 接口路径使用 /api 首先配置文件里肯定配置范围最大的根路径 server:port: 80servlet:context-path: / 过滤器代码 Slf4j public class RequestSeparationFilter implements Filter {Overridepublic void init(FilterConfig filterConfi…...

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的&#xff0c;所以在IDE中使用Git也是非常常用的&#xff0c;接下来以IDEA为例&#xff0c;其他的VS code &#xff0c;Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…...

【AIGC进阶-ChatGPT提示词副业解析】反向心理学在沟通中的运用:激将法的艺术

引言 在日常沟通和管理中&#xff0c;直接的表达方式并不总能达到预期效果。反向心理学&#xff0c;特别是其中的激将法&#xff0c;作为一种独特的沟通技巧&#xff0c;往往能在看似消极的表达中激发出积极的反应。本文将深入探讨反向心理学中激将法的运用技巧、实施策略及其…...

JeecgBoot passwordChange 任意用户密码重置漏洞复现

0x01 产品简介 Jeecg Boot是一个企业级低代码开发平台,基于前后端分离的架构,融合了SpringBoot、SpringCloud、Ant Design、Vue、Mybatis-plus、Shiro、JWT等多种主流技术,旨在帮助企业快速构建各种应用系统,提高开发效率,降低开发成本。采用最新主流的前后分离框架,使得…...

【智体OS】官方上新发布智体机器人:使用rtrobot智体应用远程控制平衡车机器人

【智体OS】官方上新发布智体机器人&#xff1a;使用rtrobot智体应用远程控制平衡车机器人 dtns.network是一款主要由JavaScript编写的智体世界引擎&#xff08;内嵌了three.js编辑器的定制版-支持以第一视角浏览3D场馆&#xff09;&#xff0c;可以在浏览器和node.js、deno、e…...

Blazor(.razor)+VUE+elementUI适合一起用吗

在实际项目中&#xff0c;将 Blazor&#xff08;.razor&#xff09; 与 Vue.js 和 ElementUI 一起使用是可以实现的&#xff0c;但是否适合取决于你的项目需求、开发团队的技术栈和具体场景。以下是对这种组合的详细分析&#xff1a; 一、适合一起使用的场景 1.1 逐步引入 Bla…...

SpringBoot左脚进门之Maven管理家

一、概念 Maven 是一个项目管理和整合工具。通过对 目录结构和构建生命周期 的标准化&#xff0c; 使开发团队用极少的时间就能够自动完成工程的基础构建配置。 Maven 简化了工程的构建过程&#xff0c;并对其标准化&#xff0c;提高了重用性。 Maven 本地仓库 (Local Reposi…...

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…...

Ubuntu 挂载目录

1. 临时挂载&#xff08;重启后失效&#xff09; 创建挂载点&#xff1a; $ sudo mkdir -p /work临时挂载磁盘到 work 目录&#xff1a; $ sudo mount /dev/nvme0n1p1 /work验证挂载是否成功&#xff1a; $ df -h /work此方法挂载在系统重启后会失效&#xff0c;需手动重新挂载…...

基于IEEE 802.1Qci的时间敏感网络(TSN)主干架构安全分析及异常检测系统设计

中文标题&#xff1a;基于IEEE 802.1Qci的时间敏感网络&#xff08;TSN&#xff09;主干架构安全分析及异常检测系统设计 英文标题&#xff1a;Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…...

2024年食堂采购系统源码技术趋势:如何开发智能的供应链管理APP

本篇文章&#xff0c;小编将与大家一同探讨2024年食堂采购系统的技术趋势&#xff0c;并提供开发更智能的供应链管理APP的策略。 一、2024年食堂采购系统的技术趋势 1.人工智能与机器学习的深度应用 在2024年&#xff0c;AI和机器学习在食堂采购系统中的应用将更加普遍。这些…...

zotero安装教程(包括茉莉花插件)

zotero安装教程&#xff08;包括茉莉花插件&#xff09; zotero下载(windows)1-安装 Zotero2-安装 Zotero Connector3-安装浏览器插件--jasminum茉莉花功能&#xff1a;插件下载地址&#xff1a;[https://github.com/search?qjasminum&typerepositories](https://github.c…...

webpack4 - 配置文件分离(详细教程)

webpack根据开发和生成环境一般可以将配置文件拆分&#xff0c;拆分dev和prod两种环境 |- package.json|- /build|- webpack.base.js|- webpack.dev.js|- webpack.prod.js在scripts里修改相应的命令 "dev": "webpack-dev-server --config build/webpack.dev.j…...

MongoDB 分片

MongoDB 分片 MongoDB 分片是一种数据库架构&#xff0c;用于将大量数据分布存储在多个服务器上。这种设计允许数据库扩展&#xff0c;以处理大量数据和高吞吐量操作。分片通过将数据集分割成小块&#xff0c;称为分片&#xff0c;并将这些分片分布到多个服务器上来工作。每个…...

PHP加载MySQL扩展

PHP本身不具备操作MySQL数据库的能力&#xff0c;需要借助PHP操作MySQL的扩展来实现 1、PHP加载MySQL扩展&#xff1a;php.ini文件中 2、PHP中所有的扩展都在ext文件中&#xff0c;需要指定扩展所在路径&#xff1a;extension_dir 3、php.ini 已经被apache加载&#xff0c;所以…...

期末复习-计算机网络篇SCAU

第一章&#xff1a;概述 1.计算机网络的特点&#xff0c;互联网发展的三个阶段 特点&#xff1a;连通性、资源共享 三个阶段&#xff1a; 1969-1990&#xff1a;从单个网络ARPANET向互联网发展 1985-1993&#xff1a;建成了三级结构的互联网 1993-现在&#xff1a;全球范…...

使用LLM进行股价预测(附代码)

使用LLM进行股价预测(附代码) 注意 代码是完整的&#xff0c;但是需要 https://github.com/wxy2ab/akinterpreter 才能完整运行 利用 Python 和 AkShare 进行股票数据分析与预测&#xff1a;以中远海控为例 在本文中&#xff0c;我们将使用 Python 的 akshare 库获取中远海…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...