Simple Logging Facade for Java (SLF4J)


slf4j可以看成是对各个日志框架的一种抽象,它提供了一套通用的日志使用接口。


下面是slf4j的几个版本比较:

1.6.0 如果没有绑定底层的日志框架的话,默认会有一个no-operation (nop)logger 的实现

1.7.0 打印方法可以指定参数类型,但是要求jdk5或以上的版本

1.7.5 更快的检索速度,所以推荐使用1.7.5或以上版本

1.7.9 通过设置能自动检测出代码中日志记录器不一致的情况,比如下面这种情况:

package com.acme;
import com.foo.Kangaroo; class Fruit {
Logger logger = LoggerFactory.getLogger(Kangaroo.class);
}

系统就会抛出警告:SLF4J: Detected logger name mismatch. Given name: "com.foo.Kangaroo"; computed name: "com.acme.Fruit".

下面这种情况除外:

class A {
Logger logger = LoggerFactory.getLogger(getClass());
}
class B extends A {
// no mismatch warning will be issued when B is instantiated
// given that class A is a super-type of class B
}

  slf4j / commons logging(jcl) / log4j / logback / java.util.logging(jul)的区别

slf4j和comms logging 都是接口而非实现 常用的实现有:log4j 、logback 、jul 等

查看详细解释

基于slf4j接口各个日志系统实现关系图如下:

使用日志系统时包的搭配如下:

其中jcl-over-slf4j.jar:覆盖jcl、log4j-over-slf4j.jar: 覆盖log4j 、jul-to-slf4j.jar:安装SLF4JHandler必需要用的包



使用slf4j经常会碰到以下几种错误
 

Failed to load class org.slf4j.impl.StaticLoggerBinder

这种情况出现的原因是没有指定具体的底层日志实现,遇到这种情况可以考虑添加如下依赖包中的一种:slf4j-nop.jar slf4j-simple.jarslf4j-log4j12.jarslf4j-jdk14.jar or logback-classic.jar  如果不做日志的操作可以考虑添加slf4j-nop.jar

Multiple bindings were found on the class path

一个项目中出现多个实现,比如同时存在log4j和logback,之前项目开发时就遇到过一种情况,我们日志系统里面使用的是log4j,但是在maven里面引入别的系统用的是logback,由于没有考虑到这种情况,最终在上线的时候内存瞬间被打印出来的日志信息占满。使得上线失败,最后采用清理系统,然后回滚到之前项目的方式才避免了损失。通过一番检查才发现是由于引入的系统用的logback,在项目部署的时候系统会寻找相应的logback的配置信息,但是问题来了,我们项目里面没有logback的配置,只有log4j配置,这个时候logback会按照默认的日志方式去打印,默认的日志级别是debug,最终造成所有的日志信息都被打印出来,下面是个人的一些关于解决项目冲突的总结:

slf4j在绑定日志底层实现时,如果使用Maven的话,Maven默认的加载机制会导致slf4j加载最终绑定pom.xml文件中排在前面的实现。如果非Maven的情况可以考虑成是随机的,由JVM决定:下面是官方的解释:The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random.

解决上面出现的问题有两种方式:

第一方式:删除到不用的日志底层实现jar包,只使用其中之一

第二种方式:排除对于具体日志的实现方式

<dependencies>
<dependency>
<groupId> org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
<version>0.8.1</version> <exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions> </dependency>
</dependencies>

文章参考:slf4j

log4j与logback

slf4j的更多相关文章

  1. slf4j中的MDC

    slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用 ...

  2. Atitit.日志系统slf4j的使用

    Atitit.日志系统slf4j的使用 SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar ...

  3. 用户代理字符串识别工具源码与slf4j日志使用

    User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.UA也成为了, ...

  4. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

  5. java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;

    如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...

  6. SLF4J: Class path contains multiple SLF4J bindings.

    库冲突导致的异常,由于多次引入SLF4j包导致. It seems you have several implementation of SLF4J; you should exclude all t ...

  7. 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案

    一.背景 最近因为公司项目性能需要,我们考虑把以前基于的log4j的日志系统重构成基于Slf4j和log4j2的日志系统,因为,使用slf4j可以很好的保证我们的日志系统具有良好的兼容性,兼容当前常见 ...

  8. Spring 使用 SLF4J代替 Commons Logging 写日志 异常

    项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示 Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/ ...

  9. slf4j的简单介绍

    SLF4J,Simple Logging Facade for JAVA,是一个十分简单的的日志facade,对于不同的日志框架做了一个封装. 对比common logging,Common logg ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  3. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  4. SQL数据库之DQL

    初来乍到,我是一个Java行业的小学生,刚学半年. 今天老师讲了数据库的操作语句,在这里与大家分享一下我学到的知识吧,要是有不足的地方麻烦大家指出来,共同进步,共同提高! 1.数据库中的各种符号 %: ...

  5. 在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误

    1.安装mysql workbench,提示未安装软件包 libpng12-0 下载了MySQL Workbench 6.3.8   在安装的时候报错: -1ubu1604-amd64.deb 提示: ...

  6. MySQL设置字段的默认值为当前系统时间

    问题产生: 当我们在对某个字段进行设置时间默认值,该默认值必须是的当前记录的插入时间,那么就将当前系统时间作为该记录创建的时间. 应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,应该由数据 ...

  7. Struts2实现ajax的两种方式

    基于Struts2框架下实现Ajax有两种方式,第一种是原声的方式,另外一种是struts2自带的一个插件. js部分调用方式是一样的: JS代码: function testAjax() { var ...

  8. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  9. MSYS2——Windows平台下模拟linux环境的搭建

    最近从MSYS1.0迁移到了MSYS2.0,简单讲,MSYS2.0功能更强大,其环境模拟更加符合linux.虽然本身来自cygwin,但其集成了pacman软件管理工具,很有linux范,并且可以直接 ...

  10. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...