springmvc整合slf4j+logback日志组合

一,问题描述

        在springmvc框架的web项目当中,使用了slf4j作为日志门面,logback作为日志的具体实现来记录日志,但是项目启动时无法按照logback.xml中配置的方式进行日志输出且控制台中有如下警告输出:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See
http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

二,问题排查

        根据控制台描述,于是点击链接,进入slf4j官网进行查看,官网中标题下,针对Failed to load class "org.slf4j.impl.StaticLoggerBinder"此问题有如下描述:

Failed to load class org.slf4j.impl.StaticLoggerBinder

This warning message is reported when the org.slf4j.impl.StaticLoggerBinder class could not be loaded into memory. This happens when no appropriate SLF4J binding could be found on the class path. Placing one (and only one) of slf4j-nop.jar slf4j-simple.jarslf4j-log4j12.jarslf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem.

SINCE 1.6.0 As of SLF4J version 1.6, in the absence of a binding, SLF4J will default to a no-operation (NOP) logger implementation.

If you are responsible for packaging an application and do not care about logging, then placing slf4j-nop.jar on the class path of your application will get rid of this warning message. Note that embedded components such as libraries or frameworks should not declare a dependency on any SLF4J binding but only depend on slf4j-api. When a library declares a compile-time dependency on a SLF4J binding, it imposes that binding on the end-user, thus negating SLF4J's purpose.

        大意为:出问题的原因是在类路径上找不到合适的SLF4J绑定。当在类路径下引入slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar,slf4j-jdk14.jar或 logback-classic.jar中的一个(并且只有一个)就可以解决问题。 同时还可以看到自1.6 后,在没有绑定的情况下,SLF4J将默认为无操作(NOP)记录器实现。

        虽然问题已经说得非常清楚了,但是在我的项目中,我已经非常明确的在pom.xml中引入了logback-classic.jar来作为logback的桥接包,同时引入了logback-core.jar的logback的核心实现包,但遗憾的是依然无法打印。

        最终经过一番查找资料,发现是因为在我的项目中pom.xml中采用了如下的写法:


    ch.qos.logback
    logback-classic
    1.2.3
    test

        问题即出在test中,scope标签在maven中,主要负责项目的部署,标签中的值主要有如下几类:

  1. compile:默认值 他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去
  2. test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
  3. runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段
  4. provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
  5. system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径

       于是直接去掉test,而使用其默认值compile,使用Reimport重新导入后,问题解决,日志管理的完整jar及版本如下:



    org.slf4j
    slf4j-api
    1.7.25


    ch.qos.logback
    logback-core
    1.2.3


    ch.qos.logback
    logback-classic
    1.2.3


三,简单扩展

        在java开发中,存在2大主要派别,分别是:Apache Commons Logging(Jakarta Commons Logging即JCL的实现,原理为动态绑定)和SLF4j(原理为静态绑定),且各自下面有很多的小跟班用户,目前slf4j较为占据上风,各自主要日志实现如下所示:

springmvc整合slf4j+logback日志组合_第1张图片springmvc整合slf4j+logback日志组合_第2张图片

 

 

 

你可能感兴趣的:(踩坑之路)