SLF4J、Log4J使用记录

程序中一直在用log4j,之前都没了解过,只知道是打印日志信息的。最近独立新建了几个开发工程,发现slf4j老有冲突,开始关注起来,我用log4j打印日志,与slf4j有毛关系,怎么老冲突呢。网上找了下原因,解决了下问题,才发现slf4j的重要性。参考多篇博文,特此记录。

slf4j:Simple Logging Facade for Java,为java提供的简单日志Facade。Facade:门面,更底层一点说就是接口。他允许用户以自己的喜好,在工程中通过slf4j接入不同的日志系统。更直观一点,slf4j是个数据线,一端嵌入程序,另一端链接日志系统,从而实现将程序中的信息导入到日志系统并记录。

因此,slf4j入口就是众多接口的集合,他不负责具体的日志实现,只在编译时负责寻找合适的日志系统进行绑定。具体有哪些接口,全部都定义在slf4j-api中。查看slf4j-api源码就可以发现,里面除了public final class LoggerFactory类之外,都是接口定义。因此,slf4j-api本质就是一个接口定义。

不同的日志库如java.util.logging、Apache log4j、logback,SLF4J不同于其他日志类库,与其它有很大的不同。SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。

下图比较清晰的描述了他们之间的关系:

当系统采用log4j作为日志框架实现的调用关系:

首先系统包含slf4j-api作为日志接入的接口;

at compile时slf4j-api中public final class LoggerFactor类中

private final static void bind() 方法会寻找具体的日志实现类绑定,主要通过
    StaticLoggerBinder.getSingleton();语句调用

slf4j-log4j12:链接slf4j-api和log4j中间的适配器。它实现了slf4j-apiz中StaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法

log4j:这个是具体的日志系统。通过slf4j-log4j12初始化Log4j,达到最终日志的输出。

另附两个引入log4j后遇到的问题解决方法:

1.无论怎么修改log4j日志级别为debug,都不能正常打印sql,

2.启动报错

Caused by: java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized. See also http://www.slf4j.org/codes.html#unsuccessfulInit

at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:310)

3.SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".该错误是警告,程序可以运行。

是由于log4j-* 、slf4j-log4j12-*、slf4j-api-*三者缺少其中一个,或者三者版本不匹配。

例如我工程中三个版本分别是log4j-1.2.14.jar、slf4j-api-1.6.2.jar、slf4j-log4j12-1.6.2。

另外,在网上下载相关jar包时发现csdn中资源下载jar有的要积分,这类公共jar也要积分,有点坑吧。有个方法是把相关jar版本写到pom.xml中,让它去下载好了在拷贝过来。

个人理解这三个包的关系:slf4j-api提供日志接口,slf4j-log4j12提供接口到log4j实现的适配,log4j是具体实现。日志实现类库有java.util.logging、Apache log4j、logback。看了那么多博文,思路中就整理出来这么句话,应该不没理解错吧。*_*.

相关博文地址:

http://wenku.baidu.com/link?url=s4cHPugb6lUxcLpBI3JQQN_oPGgPK_ToNnDRGkAasdRdTySv0vzjLVm595QpoCorg223VRpjBE4DHXHy0Roy1VCnRMnNG4q7fNs0xrBJNLO

http://www.importnew.com/7450.html

http://blog.csdn.net/tengdazhang770960436/article/details/18006127

时间: 2024-10-22 23:45:07

SLF4J、Log4J使用记录的相关文章

在android中配置 slf4j + log4j 日志记录框架

需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j 框架来实现.slf4j 是日志记录的一个facade,支持多种日志框架.log4j是个很优秀的日志记录框架. 实现: 下载类库: 先到各主站点下载类库 slf4j 网址 :http://www.slf4j.org/download.html log4j网址: http://logging.apach

通过slf4j/log4j的MDC/NDC 实现日志追踪

在分布式系统或者较为复杂的系统中,我们希望可以看到一个客户请求的处理过程所涉及到的所有子系统\模块的处理日志. 由于slf4j/log4j基本是日志记录的标准组件,所以slf4j/log4j成为了我的重点研究对象. slf4j/log4j支持MDC,可以实现同一请求的日志追踪功能. 基本思路是: 实现自定义Filter,在接受到http请求时,计算eventID并存储在MDC中.如果涉及分布式多系统,那么向其他子系统发送请求时,需要携带此eventID. 源代码:https://github.c

SLF4J 的几种实际应用模式一:SLF4J+Log4J

转载:http://zyjustin9.iteye.com/blog/2028936 SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架,谓之 Facade(门面),所扮眼的角色相当于 Jakarta Commons Logging.就像 JCL 需要底层的日志实现,如 Log4J.java.util.logging.Simple Logger 等来完成具体的信息输出,事实上基本总是 JCL+Log4J 那么一个绝配.SLF4J 的原旨也是能支持多种

log4j日志记录简析

log4j的日志系统包含两个主要概念:Logger与Appender,前者负责触发日志记录动作,后者决定日志输出至何处. 各个Logger实例之间可能存在父子关系,所有实例都有一个共同的root Logger实例,如下文的第一行的rootCategory就是root Logger实例. log4j示例文件如下: log4j.rootCategory=info,stdout # CONSOLE appender not used by default log4j.appender.stdout=o

SLF4j+LOG4j

工作笔记:在myeclipse 中创建一个java project 创建一个 TestSlf4J 类 import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestSlf4J { private static final Logger logger =LoggerFactory.getLogger(TestSlf4J.class); public static void main(String[] args)

Spring中配置使用slf4j + log4j

本人也是查看别人博客获得的方法,详细讲解请参照 https://www.cnblogs.com/yuxiaole/p/9297266.html 下面进入正题: 1.在pom.xml中注入相关的依赖 <!-- slf4j + log4j 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version&g

SSH系列:(2)日志记录 SLF4J+log4j

(1)添加jar包 (2)配置 (3)测试 1.引入jar包 建立User Library,名为slf4j 必须添加的jar包 log4j-1.2.17.jar slf4j-api-1.7.21.jar slf4j-log4j12-1.7.21.jar 可选的jar包(能够对控制台输入的日志进行不同颜色显示) color-loggers-1.0.4.1.jar 注意:需要要合Eclipse的插件(ANSI Escape in Console)一起使用 后期需要添加的jar包 (当前不引入此jar

日志:slf4j+log4j+maven配置

代码的日志输出,前前后后折腾了我好几次. 本着会用,快速配置的原则,还是将配置过程记录下来,以便复用. 参考:http://blog.csdn.net/anialy/article/details/8529188 1. 据说slf4j的效率比log4j的效率高,所以大体上采用slf4j来记录日志. 2. slf4j提供了一套api而log4j是具体的实现,所以想使用slf4j则需要具体实现slf4j的api. 所以,log4j实现 + slf4j api ==> slf4j实现, 此过程采用了适

slf4j+log4j配置(Maven)

首先配置Maven依赖 <!-- http://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.21</version> </dependency> 代