我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Slf4j与其他日志系统兼容的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Slf4j与其他日志系统兼容的示例分析

这篇文章主要介绍Slf4j与其他日志系统兼容的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1. 接口简介

在java的体系里,主要有slf4j和common-logging两种日志体系接口。实现的框架有很多,主流的诸如logback、log4j等。

当然,虽然都是接口,但两者也可以通过桥接包实现相互的日志代理输出。

Slf4j与其他日志系统兼容的示例分析

common-logging挂载的日志实现常为log4j。在初始化的时候,如果没有特殊指定要挂载谁,会自动按上图顺序去实例化实现,log4jLogger封装了log4j的logger,打印日志的时候调用到log4j过去。

2. SLF4j 的桥接和被桥接

slf4j作为一个接口定义,底层可以有很多实现框架,同时也可以支持别的日志实现或者框架打到sfl4j上。它的实现是基于不同的桥接包。

2.1 slf4j的桥接

Slf4j与其他日志系统兼容的示例分析

slf4j作为接口定义,下面有很多种实现。实现原理是获取ILoggerFactory时执行初始化,初始化过程绑定实现对象:load出所有实现StaticLoggerBinder的类,然后获取他的单例,后面执行getLogger的时候都是调用这个单例类的方法获取对应有具体实现日志功能的Logger对象。如果有多个实现,之后绑定其中的一个。这种情况需要排除掉不需要的日志实现类。

2.2 slf4j的被桥接

Slf4j与其他日志系统兼容的示例分析

上图展示了其他日志系统如何接入到slf4j日志体系,其中基本原理是针对各自日志体系做了代理 ,输出到了sfl4j接口中,具体实现可以去看桥接包的实现。基本都是对原日志体现做了重新实现,然后底层实际调用日志输出的方法是走到了slf4j上面 。

只有jul是个例外,因为是java自带jdk实现,没法去重新那些类,这个地方根据jul的handler扩展机制实现了一个slf4j的handler然后把日志写到slf4j上面。同时要生效的话,还要修改jre/lib/logging.properties把新的handler配置到.handlers属性中。一般生产不会去这么搞。

2.3 应用

实际项目应用的时候要注意,桥接和被桥接的包不能同时出现,不然会出现死循环了,比如sfl4j既桥接了log4j又被log4j桥接,那log4j输出调用会指向slf4j,slf4j又指向log4j如此循环。一定要注意排除掉无用的包。

生产建议:slf4j-api下挂载的实现只保留logback,上层的日志打印桥接可以存在都指向到slf4j。

参考如下依赖,其他关于log的包统统排掉:

<dependencies> <dependency>  <groupId>org.slf4j</groupId>  <artifactId>slf4j-api</artifactId>  <version>1.7.24</version> </dependency> <dependency>  <groupId>ch.qos.logback</groupId>  <artifactId>logback-classic</artifactId>  <version>1.2.1</version> </dependency> <dependency>  <groupId>org.slf4j</groupId>  <artifactId>jcl-over-slf4j</artifactId>  <version>1.7.14</version> </dependency> <dependency>  <groupId>org.slf4j</groupId>  <artifactId>log4j-over-slf4j</artifactId>  <version>1.7.24</version> </dependency> <dependency>  <groupId>org.slf4j</groupId>  <artifactId>jul-to-slf4j</artifactId>  <version>1.7.7</version> </dependency></dependencies>

3. 测试代码实现及pom

测试代码

public class TestLoggers {   public void testSfl4jUpLog4j(){  org.slf4j.Logger logger = LoggerFactory.getLogger(TestLoggers.class.getName());  logger.info("Slf4j print use log4j"); }   public void testSlf4j2CommonLogging(){  org.slf4j.Logger logger = LoggerFactory.getLogger(TestLoggers.class.getName());  logger.warn("Slf4j print to common logging"); }   public void testLog4j2Slf4j(){  org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger(TestLoggers.class.getName());  logger.info("Log4j print to slf4j"); }   public void testCommonLogging2Sl4j(){  Log log = LogFactory.getLog(TestLoggers.class.getName());  log.info("common log to slf4j"); }   public void testJul2Slf4j(){  java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TestLoggers.class.getName());  logger.info("jul print to slf4j"); }  public static void main(String[] args) {  TestLoggers tester = new TestLoggers();  tester.testSlf4j2CommonLogging(); }}

测试maven依赖

<dependencies>  <dependency>   <groupId>org.slf4j</groupId>   <artifactId>slf4j-api</artifactId>   <version>1.7.24</version>  </dependency>  <dependency>   <groupId>commons-logging</groupId>   <artifactId>commons-logging-api</artifactId>   <version>1.1</version>  </dependency>   <!--<dependency>-->   <!--<groupId>org.slf4j</groupId>-->   <!--<artifactId>jcl-over-slf4j</artifactId>-->   <!--<version>1.7.14</version>-->  <!--</dependency>-->  <dependency>   <groupId>org.slf4j</groupId>   <artifactId>log4j-over-slf4j</artifactId>   <version>1.7.24</version>  </dependency>   <!--<dependency>-->   <!--<groupId>org.slf4j</groupId>-->   <!--<artifactId>jul-to-slf4j</artifactId>-->   <!--<version>1.7.7</version>-->  <!--</dependency>-->    <!--<dependency>-->   <!--<groupId>ch.qos.logback</groupId>-->   <!--<artifactId>logback-classic</artifactId>-->   <!--<version>1.2.1</version>-->  <!--</dependency>-->    <!--<dependency>-->   <!--<groupId>org.slf4j</groupId>-->   <!--<artifactId>slf4j-log4j12</artifactId>-->   <!--<version>1.7.5</version>-->  <!--</dependency>-->  <dependency>   <groupId>log4j</groupId>   <artifactId>log4j</artifactId>   <version>1.2.17</version>  </dependency>   <dependency>   <groupId>org.slf4j</groupId>   <artifactId>slf4j-jcl</artifactId>   <version>1.7.24</version>  </dependency>  </dependencies>

以上是“Slf4j与其他日志系统兼容的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Slf4j与其他日志系统兼容的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Slf4j与其他日志系统兼容的示例分析

这篇文章主要介绍Slf4j与其他日志系统兼容的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 接口简介在java的体系里,主要有slf4j和common-logging两种日志体系接口。实现的框架有很多,
2023-05-30

centos中日志式文件系统的示例分析

这篇文章主要介绍了centos中日志式文件系统的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、日志式文件系统通常在系统运行中写入文件内容的同时,并没有写入文件的元
2023-06-10

Linux系统硬件故障日志的示例分析

这篇文章主要介绍Linux系统硬件故障日志的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,在
2023-06-28

Ubuntu编译内核模块和内容体现系统日志中的示例分析

这篇文章给大家分享的是有关Ubuntu编译内核模块和内容体现系统日志中的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Linux登陆界面1.检查当前文件目录:通过Xshell连接Linux系统后输入命
2023-06-22

linux系统管理mail电子邮件日志的示例分析

这篇文章主要为大家展示了“linux系统管理mail电子邮件日志的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux系统管理mail电子邮件日志的示例分析”这篇文章吧。我们都知道很
2023-06-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录