SLF4J

log4j-over-slf4j的jar包适配原理解析 如果想把项目中的日志实现统一成slf4j的话,则需要把第三方一些依赖包中的日志包去掉,例如Spring中的jcl,或者其他的像早期的log4j,如果直接排除,则程序肯定会运行报错,此时需要引入适配包,这个适配包就是一个狸猫换太子包,这个包有着和jcl和log4j一摸一样的包名和类名,所以在程序动态运行过程中,只需要关心classpath下有没有这个类即可,并不需要知道这个类在哪个jar包,正因如此,才能实现狸猫换太子的功能。下面写一个测试程序:最开始是先有的jcl这个包,然后这个包中依赖log4j这个包,在 阅读详情

 

SLF4J服务于各种各样的日志API,并允许最终用户在部署时加入所希望的实施(logging API),以展现Log不同的风格、布局,并且灵活的切换以得到高效率无耦合的结果。

Logging API实现既可以选择直接实现SLF4J接口的logging APIs如: logbackSimpleLogger,当然它也可以构造SLF4J适配器来应用所提供的API,例如Log4jLoggerAdapterJDK14LoggerAdapter.因此SLF4J所提供的针对LOG的多方面应用及开发,能够为我们在软件开发中的LOG表现提供更灵活,更多样化的展现。

    SLF4J是一个Log的表现,其并不能提供完全的日志应用。对于配置及日志的级别都不能通过SLF4J得到体现。另一方面,独立的应用程序过余依赖logging systemAPI,然而SLF4J则可以使依赖性降低到近乎最低的程度。假设有一个使用log4jCRM应用程序。当用户要求通过JDK 1.4 logging来表现日志的时候,面对成千上万的log4j的直接调用,转换成JDK1.4将成为一个很长错误频频的处理过程。当我们调用SLF4J来代替log4j的时候,这样的转变将成为一件十分轻松的事。还有一个值得提及的问题就是,SLF4J 不依赖任何特殊的class loader机制,实际上,SLF4J 和已有日志实现的绑定是在编译时静态执行的,具体绑定工作是通过一个jar包实现的。因此对于SLF4J的应用不需要对应用程序进行重新编译,而只需要对classpathjar进行设置。在部署的时候,终端用户可以通过插入相应的jar包文件来选择日志的描述形式。slf4j-api.jar必须在classpath下设置路径以提供函数(方法)使用,以配合classpah下的SLF4J包的应用,也就是说SLF4J提供多用户日志系统,包括NOPSimplelog4j 1.2JDK 1.4JCLlogback.并响应的发布一些包slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-log4j13.jar, slf4j-jdk14.jar and slf4j-jcl.jar,切都依赖于slf4j-api.jar

提供从JCLSLF4J的转变。当然对于log4j也提供了相应的log4j-over-slf4j.jar包。

jcl104-over-slf4j.jarslf4j-jcl.jar包,前者建立在SLF4J基础上的JCL API提供完整的逆兼容性,并且在替换以后不存在class loader装载的问题,而且在logging system以下能够通过classpath的配置替换使用NOP, simple, jdk14 logging, log4j 或者 logback。后者则应用的SLF4J API,并在需要JCL应用时提供JCL Binding,这也是以提供用户以灵活便捷的使用。当然二者不能同时使用,否则会导致对SLF4JJCL的混乱使用。

以下是一些应用上面的基础:

debug(String msg, Throwable t)

可以保证每个异常与日志描述信息相联系。

logger.error("some accompanying message", e);

e作为一个异常,在处理的时候应当关联一个相应的信息。

SLF4J 1.0beta4中,打印输出方法被修改成只能接受String类型消息来替代Object类型,例如debug().info().warn().error().,这些都是日志级别的具体方法。

debug(String msg);

debug(String format, Object arg);

debug(String format, Object arg1, Object arg2);

debug(String msg, Throwable t);

早先第一个参变量是Object类型,现在成为一种格式化的String类型。例:

Object entry = new SomeObject();

logger.debug("The entry is {}.", entry);

entry替代{}

logger.debug("The new entry is {}. It replaces {}.", entry, oldEntry);

entryoldEntry替代前后两个{}

logger.debug("Value {} was inserted between {} and {}.", new Object[] {newVal, below, above});

加强效率~避免debug在无效的时候执行。主要针对效率不高的情况下。

if(logger.isDebugEnabled())

 { logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }

总的来说,按照SLF4J的中文翻译,及站点上所提供的介绍,其构建的初衷就是为了为用户的各种log表现需求提供更加便捷,更加灵活高效的应用方式,无论是从JCLlog4j的转换,还是自身的独立应用,都表现出了一种开发与维护使用的分离,加强了log的自由应用。

 

一些基本应用:

package slf4jDemo;

 

import java.io.*;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.lang.*;

 

 

class slf4j extends Exception{

    Logger t=LoggerFactory.getLogger(slf4j.class);

   

    public void setMessage(String a)

    {

       t.error("异常种类为{}",a);

    }

    }

 

public class slf4jtest {

    private int i;

    public  void f1() throws FileNotFoundException

    {

       FileInputStream f=new FileInputStream(new File("E://JAVA//slf4j//slf4jDemo//test11"));

       throw new FileNotFoundException("test not found");

    }

    public void f2() throws FileNotFoundException

    {

       FileInputStream f=new FileInputStream(new File("E://JAVA//slf4j//slf4jDemo//test22"));

       throw new FileNotFoundException("test1 not found");

    }

    public static void main(String []args){

       slf4j basin=new slf4j();

       slf4jtest test=new slf4jtest();

       try{

           test.f1();   

                  }

       catch(FileNotFoundException n){

                         basin.setMessage(n.getMessage());

                     }

       try{

           test.f2();

           }

       catch(FileNotFoundException m){

                  basin.setMessage(m.getMessage()); 

                         }

    }

解决SlF4J配置冲突警告:【SLF4J: Class path contains multiple SLF4J providers】 SLF4J :Class path contains multiple SLF4J bindings.这样的异常情况还有很多,这是一大类问题,解决的思路都是一样的:分析pom依赖,找到依赖冲突的jar,在对应的pom中将期排除就ok。 阅读详情

相关推荐

【项目实战】分布式日志系统 之 Exactly-once 语义:确保数据处理的精确性

在分布式系统的数据传输与处理中,是一种核心可靠性保障,其目标是确保数据“仅被处理一次”——既不重复(避免多次处理),也不遗漏(避免未处理)。与,二者共同保障数据处理的精确性。Exactly-once 语义是分布式系统中数据可靠性的高级目标,其核心通过“幂等设计”(解决重复问题)和“分布式事务”(解决原子性问题)实现。在实际应用中,常结合 At-Least-Once 语义与幂等性,或通过事务 API 与唯一 ID 去重的组合,平衡可靠性与系统性能。

奶爸的编程之路,也就一周冷个三天 137

log4j-over-slf4j工作原理详解

log4j-over-slf4j工作原理详解

johnhuster的专栏 3万+

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2591

slf4j log4j log4j-over-slf4j self-log4j12

slf4j commons-logging logback-classic log4j log4j2 slf4j-log4j12 log4j-slf4j-impl log4j-over-slf4j jcl-over-slf4j jul-toslf4j

song854601134的博客 2512

slf4j logback log4j slf4j-log412 log4j-over-slf4j 关系详解

引言 对于j2ee 开发者来说,难免会引入各种框架,而当需要查看框架打印的日志的时候,你会发现每个框架引用的日志框架又不相同,什么slf4j,logback,log4j… 头都大了,处理的一不小心,轻则日志打印不出来,重则项目起不来,甚至会造成内存泄露。那么他们之间到底是什么关系呢? java中的日志框架 上图可以大体概况java的日志框架结构,slf4j和jcl作为日志的门面,存在于最上层。我...

jackllvv的博客 5290

04、slf4j(日志门面)

文章目录前言一、认识slf4j1.1、slf4j概述1.2、第三方jar包1.3、切换日志框架详略图1.4、相关注意点二、实际应用2.1、配合自身简单日志实现(slf4j-simple)2.2、配置logback日志实现2.3、配置Log4j日志实现(需适配器)2.4、配置JUL日志实现(需适配器)2.4、添加slf4j-nop依赖(日志开关)三、原理分析3.1、初始绑定日志实现原理四、桥接旧的日志实现框架介绍桥接器4.1、log4j-over-slf4j桥接器使用解决过程原理分析4.2、jul、jcl桥接

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1155

解决SLF4J: Class path contains multiple SLF4J bindings.

JDK版本:jdk17IDEA版本:IntelliJ IDEA 2022.1.3SpringBoot 版本:v2.5.7maven版本:3.6.3。

siaok的博客 1万+

slf4j

简单的Java日志记录(SLF4J) 官方文档:https://www.slf4j.org/docs.html 一.什么是SLF4JSLF4J是用于日志记录系统的简单外观,允许最终用户在部署时插入所需的日志记录系统。Simple Logging Facade for Java(SLF4J)用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽...

三木的博客 1万+

【解决】SLF4J: Class path contains multiple SLF4J bindings.

【解决】SLF4J: Class path contains multiple SLF4J bindings. 在启动springboot项目时,遇到了这个问题,上网查询多个方案,最终这个方法得到解决 问题描述: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/D:/Program%20Files/JavaEclipse/repo/ch/qos/logback/logback-cla

HKD的博客 8万+

SLF4J的使用

当我们的系统变的更加复杂的时候,我们的日志就容易发生混乱。随着系统开发的进行,可能会更新不同的日志框架,造成当前系统中存在不同的日志依赖,让我们难以统一的管理和控制。就算我们强制要求所有的模块使用相同的日志框架,系统中也难以避免使用其他类似spring,mybatis等其他的第三方框架,它们依赖于我们规定不同的日志框架,而且他们自身的日志系统就有着不一致性,依然会出来日志体系的混乱。...

凉茶铺的博客 6222

SLF4J深入剖析(涵盖SLF4J 1.8)

1.SLF4J SLF4J全称 Simple Logging Facade for Java,它为Java下的日志系统提供了一套统一的门面(接口)。通过引入SLF4J,我们可以使项目的logginglogging具体的实现分离,在提供了一致的接口的同时,提供了灵活选择logging实现的能力。 在SLF4J之前,Apache Common Logging(即Jakarta Commons L...

近路 2375

SLF4J 的几种实际应用模式--SLF4J+Log4JSLF4J+LogBack

小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人。

2401_85730279的博客 1222

关于SLF4j

SLF4J(Simple Logging Facade for Java)是一个Java平台上的日志框架,它提供了一种简单的、统一的接口,用于在应用程序中进行日志记录。SLF4J的目标是在代码中屏蔽底层的日志框架实现细节,使开发人员能够更轻松地切换不同的日志框架。简单易用:SLF4J的接口设计简单明了,易于理解和使用。统一接口:SLF4J提供了一套统一的接口,可以与不同的日志框架进行集成,包括Logback、Log4j、java.util.logging等。

Flying_Fish_roe的博客 1045

SLF4J 报错解决:No SLF4J providers were found

SLF4J 报错

tumu6889的博客 7871

Springboot中SLF4J详解

SLF4J为Spring Boot应用提供了一个灵活且强大的日志记录解决方案。通过简单的配置,开发者可以轻松地控制日志输出的级别和格式,同时保持代码的整洁和一致性。无论是开发阶段的调试还是生产环境的监控,SLF4J都是一个不可或缺的工具。版权声明:本博客内容为原创,转载请保留原文链接及作者信息。参考文章SpringBoot——整合SLF4j进行日志记录SpringBoot默认日志框架(slf4j)的使用以及配置文件。

ning的博客 4227

彻底解决SLF4J的日志冲突的问题

今天公司同事上线时发现,有的机器打印了日志,而有的机器则一条日志也没有打。以往都是没有问题的。 因此猜测是这次开发间接引入新的日志jar包,日志冲突导致未打印。 排查代码发现,系统使用的是SLF4J框架打印log4j2的日志。查看系统中引入的jar包发现果然有多个SLF4J的桥接包。于是排掉冲突jar包,然后上线时所有机器都正常打印日志 先上一张关系图:SLF4J框架、各种具体日志实现以及相应桥接包的关系图 一、起因 由于线上系统要接入很多中间件,因此系统中会有各种各样的日志打印形式(例如:log4j2

苦行僧 3286

java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar AND slf4j-log4j12异常的解决方法

博主今天创建一个springboot项目整合ElasticSearch的时候启动项目发生了一个这样子的异常(如下图) 博主本人在网上也查阅了很多博客也参考了很多文章 基本上都是说log4j的jar包冲突 但的确也是这样 网上的解决方法是 在maven中引入其他依赖时,可以排除对log4j的引用: <exclusion> <groupid>log4j</gro...

zhanxiaozhangA的博客 1915

java log4j api_Java日志框架——JCL(Log4J,Java Logging API )转SLF4J

一、应用场景有很多以前的项目采用JCL,Log4J,Java Logging API等作为日志框架,现在如果想改成使用流行的SLF4J日志框架,但是不能改变项目代码,该如何做?这就是jcl-over-slf4j(针对的是原来使用JCL),log4j-over-slf4j(针对的是原来使用Log4J),jul-to-slf4j(针对的是原来使用Java Logging API)等转换方案产生的原因所...

weixin_28893705的博客 866

log4j-over-slf4jslf4j-log4j12共存stack overflow异常分析

log4j-over-slf4jslf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。 先大致梳理了一下现有Java日志体系接口,然后仔细分析了这种异常出现的原因,最后重现异常并展示了详细的调用过程。

kxcfzyk的专栏 3万+

java log4j记录_log4j-over-slf4jslf4j-log4j12导致StackOverflowError分析

log4j-over-slf4jslf4j-log4j12是跟Java日志系统相关的两个jar包,当它们同时出现在classpath下时,就可能会引起堆栈溢出异常。异常信息大致如下:Exception in thread "main" java.lang.StackOverflowError at java.util.Hashtable.containsKey(Hashtable.java:30...

weixin_39907762的博客 691

最新中国生态功能区矢量Shp数据

包含4份数据:生态大区(按中国的地貌、水热组合、植被特征等自然条件划分为3个生态大区)、生态区(按生态系统类型、地理特征等自然条件,在生态大区的基础上划分为50个生态区)+生态亚区(按生态系统的结构特征、地理特征等为依据,在生态区的基础上划分为206个生态亚区)+生态功能区(根据生态系统的功能特征、地理特征等为依据,在生态亚区的基础上分为1434个生态功能区)。采用Albert投影、Clarke地理坐标系、UTF8编码。属性字段包含:AREA/区域位置/服务功能/名称等18个字段信息

上一篇: 社会
下一篇: Tapestry笔记(二)
basin_yi
博客等级 码龄21年 12粉丝 44原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值