广告
返回顶部
首页 > 资讯 > 精选 >Slf4j与其他日志系统兼容的示例分析
  • 255
分享到

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

2023-05-30 17:05:14 255人浏览 泡泡鱼
摘要

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

这篇文章主要介绍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与其他日志系统兼容的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Slf4j与其他日志系统兼容的示例分析

本文链接: https://www.lsjlt.com/news/219939.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Slf4j与其他日志系统兼容的示例分析
    这篇文章主要介绍Slf4j与其他日志系统兼容的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 接口简介在java的体系里,主要有slf4j和common-logging两种日志体系接口。实现的框架有很多,...
    99+
    2023-05-30
  • Python日志与npm、Linux系统的兼容性分析。
    Python日志与npm、Linux系统的兼容性分析 Python是一种广泛使用的高级编程语言,它的日志系统是Python标准库中的一部分。在Python应用程序中,日志系统是必不可少的。然而,当与npm和Linux系统一起使用时,Pyth...
    99+
    2023-08-23
    日志 npm linux
  • Linux系统硬件故障日志的示例分析
    这篇文章主要介绍Linux系统硬件故障日志的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!系统日志是记录系统中硬件、软件和系统问题的信息,同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,在...
    99+
    2023-06-28
  • centos中日志式文件系统的示例分析
    这篇文章主要介绍了centos中日志式文件系统的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。日志式文件系统通常在系统运行中写入文件内容的同时,并没有写入文件的元数据...
    99+
    2023-06-10
  • Linux系统上的日志分析:用Go语言和NumPy还是其他工具?
    Linux系统中的日志是非常重要的信息资源,可以帮助我们了解系统的运行状态、异常情况以及安全问题。对于大规模的系统来说,日志数据量往往非常庞大,如何高效地对日志进行分析和处理是非常关键的。 在日志分析领域,目前有很多工具可供选择,包括但不...
    99+
    2023-07-06
    linux numy 日志
  • Ubuntu编译内核模块和内容体现系统日志中的示例分析
    这篇文章给大家分享的是有关Ubuntu编译内核模块和内容体现系统日志中的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Linux登陆界面检查当前文件目录:通过Xshell连接Linux系统后输入命令:...
    99+
    2023-06-22
  • linux系统管理mail电子邮件日志的示例分析
    这篇文章主要为大家展示了“linux系统管理mail电子邮件日志的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“linux系统管理mail电子邮件日志的示例分析”这篇文章吧。我们都知道很...
    99+
    2023-06-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作