zoukankan      html  css  js  c++  java
  • spring (boot)使用log4j2实现slf4j日志门面

    jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

    解决启动时报错:

    No SLF4J providers were found

    Failed to load class "org.slf4j.impl.StaticLoggerBinder

    只想看解决报错的点击>>这里<<



    一、Java日志框架

    详情参考1 详情参考2

    当系统逐渐复杂,System.out.println() 满足不了我们的时候,就需要写日志了

    Java日志时间轴:

    log4j(1999-2015)--> JUL(2000-)--> JCL --> slf4j --> logback(2006-) --> log4j2(2012-)

    1. log4j(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目

    2. Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了JUL(java.util.logging)

    3. 毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。

    4. Apache见此,开发了JCL(Jakarta Commons Logging),即commons-logging-xx.jar。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。

    5. 这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出slf4j,它跟JCL类似,本身不提供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback,一个比log4j拥有更高性能的组件,目的是为了替代log4j。

    6. Apache参考了logback,并做了一系列优化,推出了log4j2

    总结,目前我们使用JCL或slf4j门面,使用logback或log4j2实现



    二、日志桥接

    首先看slf4j官方说日志应该如何桥接

    官方文档1

    官方文档2

    Spring 框架选择使用了 JCL 作为默认日志输出。而 Spring Boot 默认选择了 SLF4J 结合 LogBack

    所以在Spring中我们应当使用jcl-over-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

    在Spring Boot中我们应当去除LogBack依赖后使用jul-to-slf4j + slf4j-api + log4j-slf4j-impl + log4j-core + log4j-api

    但是Spring Boot提供了更好的选择spring-boot-starter-log4j2

    从maven官网中我们可以看到它集成了log4j-slf4j-impl + log4j-core + log4j-jul + jul-to-slf4j



    三、解决报错

    本文编辑于2021-12-11

    第一个报错No SLF4J providers were found

    原因是slf4j-api、jcl-over-slf4j版本不对,用了2.0.0-alpha5,应该用1.7.32

    第二个报错Failed to load class "org.slf4j.impl.StaticLoggerBinder

    原因是从maven官网复制的配置含有<scope>test</scope>,应该改为<scope>compile</scope>

    这些报错如果按报错提示的链接去官网查看的话,都是要求引入一堆依赖进项目,但其实并不是解决根本问题,反而会以为引入混乱的依赖导致最后写日志的不是log4j2了



    四、log4j2配置文件

    配置文件名为log4j2.xml,放在resources文件夹下




    end

    相关文章:

    《jndi ldap/rmi RCE介绍:fastjsion反序列化漏洞,log4j2命令执行》

    《fastjson整合到spring boot中》


  • 相关阅读:
    生产者—消费者模型
    使用wait/notify/notifyAll实现线程间通信的几点重要说明
    死锁
    python基础:协程详解
    python爬虫:multipart/form-data格式的POST实体封装与提交
    python爬虫:Multipart/form-data POST文件上传详解
    python爬虫:http请求头部(header)详解
    python爬虫:登录百度账户,并上传文件到百度云盘
    python爬虫:urlparse模块拆分url
    转:python爬虫:html标签(图文详解二)
  • 原文地址:https://www.cnblogs.com/yunmuq/p/15674936.html
Copyright © 2011-2022 走看看