Java 界里有许多实现日志功能的工具,最早得到广泛使用的是 log4j,许多应用程序的日志部分都交给了
log4j,不过作为组件开发者,他们希望自己的组件不要紧紧依赖某一个工具,毕竟在同一个时候还有很多其他很多日志工具,假如一个应用程序用到了两个组
件,恰好两个组件使用不同的日志工具,那么应用程序就会有两份日志输出了。
为了解决这个问题,Apache Commons Logging (之前叫 Jakarta Commons
Logging,JCL)粉墨登场,JCL 只提供 log 接口,具体的实现则在运行时动态寻找。这样一来组件开发者只需要针对 JCL
接口开发,而调用组件的应用程序则可以在运行时搭配自己喜好的日志实践工具。
所以即使到现在你仍会看到很多程序应用 JCL + log4j
这种搭配,不过当程序规模越来越庞大时,JCL的动态绑定并不是总能成功,具体原因大家可以 Google
一下,这里就不再赘述了。解决方法之一就是在程序部署时静态绑定指定的日志工具,这就是 SLF4J 产生的原因。
跟 JCL 一样,SLF4J 也是只提供 log 接口,具体的实现是在打包应用程序时所放入的绑定器(名字为
slf4j-XXX-version.jar)来决定,XXX 可以是 log4j12, jdk14, jcl, nop
等,他们实现了跟具体日志工具(比如 log4j)的绑定及代理工作。举个例子:如果一个程序希望用 log4j 日志工具,那么程序只需针对
slf4j-api 接口编程,然后在打包时再放入 slf4j-log4j12-version.jar 和 log4j.jar 就可以了。
现在还有一个问题,假如你正在开发应用程序所调用的组件当中已经使用了 JCL 的,还有一些组建可能直接调用了
java.util.logging,这时你需要一个桥接器(名字为 XXX-over-slf4j.jar)把他们的日志输出重定向到
SLF4J,所谓的桥接器就是一个假的日志实现工具,比如当你把 jcl-over-slf4j.jar 放到 CLASS_PATH
时,即使某个组件原本是通过 JCL 输出日志的,现在却会被 jcl-over-slf4j “骗到”SLF4J 里,然后 SLF4J
又会根据绑定器把日志交给具体的日志实现工具。过程如下
Component
|
| log to Apache Commons Logging
V
jcl-over-slf4j.jar --- (redirect) ---> SLF4j ---> slf4j-log4j12-version.jar ---> log4j.jar ---> 输出日志
看到上面的流程图可能会发现一个有趣的问题,假如在 CLASS_PATH 里同时放置 log4j-over-slf4j.jar 和 slf4j-log4j12-version.jar 会发生什么情况呢?没错,日志会被踢来踢去,最终进入死循环。
所以使用 SLF4J 的比较典型搭配就是把 slf4j-api、JCL 桥接器、java.util.logging(JUL)桥接器、log4j 绑定器、log4j 这5个 jar 放置在 CLASS_PATH 里。
不过并不是所有APP容器都是使用 log4j 的,比如 Google AppEngine 它使用的是
java.util.logging(JUL),这时应用 SLF4J 的搭配就变成
slf4j-api、JCL桥接器、logj4桥接器、JUL绑定器这4个 jar 放置在 WEB-INF/lib 里。
Logback
先找 logback-test.xml
,没有则找 logback.xml
文件,都找不到就使用 BasicConfigurator
基本配置,BasicConfigurator
就是相当于等会贴出的 logback.xml
文件内容的配置。这里我们用 logback.xml
配置文件,以前的 log4j.properties
文件可以用
PropertiesTranslator
转换成 logback.xml
文件内容。
主配置文件为logback.xml
,放在src
目录下或是WEB-INF/classes
下,logback
会自动加载
下面是一个最简单的 logback.xml
文件内容
01
02
03
04
05
06
07
08
09
10
11
|
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="GBK">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref
="stdout" />
</root>
</configuration>
使用 Logback
的代码
01
02
03
04
05
06
07
08
09
10
11
12
|
package com.unmi;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestLogback {
private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
public static void main(String[] args) {
logger.info("Hello {}","TestLogback");
}
}
|
可以看到与使用 SLF4J
的代码没有任何区别,因为本来用的通用日志框架就是 SLF4J
,说到底,这里的 Logback
就相当于 SLF4J+Log4J
使用方式中的 Log4J
绑定和 Log4J
的功能。
在
log4j.xml
能做的配置,
logback.xml
中也能做到,而且还增强了诸如
<if><then><else>
、
<filter>
、
<
sift
>
等更强的控制,请参考
logback
的手册
http://logback.qos.ch/manual/index.html
。
|
如之前有
log4j
,想用
log4j
和
logback
共存:
则需
jcl-over-slf4j-xx.jar
commons-logging
(spring
和
struts2
框架要用到)
logback-classic-x.xjar
logback-core-xx.jar
slf4j-api-xx.jar
log4j-over-slf4j-xx.jar
如全新项目,则推荐只用
logback,
只需以下
jar
:
logback-classic-1.0.0.jar
logback-core-1.0.0.jar
slf4j-api-1.6.4.jar
jcl-over-slf4j-1.6.4.jar
commons-logging
(
spring
和
struts2
框架要用到)
如果用
slf4j+log4j
则以下
jar:
slf4j-api-1.6.4.jar
slf4j-logj12.jar
(
slf4j
与
log4j
之间的绑定)
log4j.jar
SLF4J
在使用其他日志实现框架的时候都是 SLF4J+
相应绑定+
日志实现,这里缩写成的 SLF4J+Log4J
,中间是有一个 SLF4J
到 Log4J
的绑定的。完整表述它们就是:
SLF4J+Log4J
的方式:
slf4j-api-1.5.11.jar + slf4j-log4j12-1.5.11.jar + log4j-1.2.15.jar
SLF4J+Logback
的方式:slf4j-api-1.5.11.jar + logback-classic-0.9.20.jar + logback-classic-0.9.20
前一个 logback-classic-0.9.20.jar
是作为绑定用的,后一个是作为日志实现用的,也就是 logback-classic-0.9.20.jar
把前面的 slf4j-log4j12-1.5.11.jar
和 log4j-1.2.15.jar
两个包的功能揉合在了一起。
搞明白了 Logback
在其中所担当的角色后,我们就知道,说使用了 Logback
应用组件,实际它们所用的统一日志组件只是 SLF4J
。也可以说 Logback
就是 Log4J
那样,只是自身带了绑定的日志实现。
log4j
配置文件也会自动加载
只要默认名为log4j.properties/log4j.xml
且放在src
目录下,都可以自动加载配置文件
logger.debug
("param: order. < " + getParameter(order) + " >");
在log4j
中,先拼接字符串,再进行判断,当前的日志输出策略是否允许输出debug
信息,如允许,则输出, 不允许,则放弃
性能不太好,容易造成拼接了大量字符串,而最后放弃,严重影响程序速度。
if
(
logger
.isDebugEnabled()) {
logger
.debug(
"param: order. < "
+ getParameter(order) +
" >"
);
}
这样写,如果不允许
debug
时(级别为
info
时)
,则不进行字符串拼接。。但是,如果允许
debug
,则会判断两次,一次在
logger
.isDebugEnabled()
,一次在
logger
.debug
,这样也会影响性能。
在
logback
中
logger
.debug(
"hello,{}"
,
"slf4j_debug"
);
logger
.info(
"hello,{}"
,
"slf4j_info"
);
则将字符串拼接延后,先判断
debug
是否可用,再进行拼接,提高了效率和运行速度。
Logback
加载配置文件顺序及截图:
关于个别包的日志级别的调整(个性化)如图:默认的包会启用
INFO
级别,设置后,
com.logback.error
包的日志级别为
error
,其中
info
、
debug
级别日志不打印。
com.logback.debug
包的日志级别为
debug
,其中
debug
及其以上级别会打出,而默认只会打出
INFO
级别信息,
此可以追踪异常,而只需调整一部分日志级别,不影响整体。
- 大小: 219.8 KB
- 大小: 12 KB
分享到:
相关推荐
在实际使用场景中,例如,当您的项目已经使用了JCL,但您想升级到更强大的日志框架Log4j时,`jcl-over-slf4j-1.6.0.jar`就能派上用场。只需将JCL替换为SLF4J桥接包,然后配置Log4j的配置文件,就可以实现平滑过渡。 ...
然而,JCL存在一些问题,例如类加载器冲突和性能问题,因此SLF4J-JCL提供了转换路径,让这些库能够利用更现代、更强大的日志系统,比如logback或log4j2。 在"common-jackson.zip"中,我们看到提到了Jackson,这是一...
SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个接口,允许用户在运行时动态地绑定到各种具体的日志框架,如Log4j、Java内置的日志或者Logback等。这个设计使得开发者可以在不修改...
3. **日志实现选择**:在SLF4J 1.7.12压缩包中,可能包含了多种日志实现的绑定器,如logback-classic.jar(Logback绑定器)、slf4j-log4j12.jar(Log4j绑定器)等。根据项目需求,开发者可以选择合适的一个,并将其...
jcl-over-slf4j-1.6.1.jar log4j-1.2.8.jar logback-access-0.9.24.jar logback-classic-0.9.24.jar logback-core-0.9.24.jar servlet-api.jar slf4j-1.6.1+logback-0.9.24.rar slf4j-api-1.6.1.jar
commons-logging-1.2.jar、log4j-1.2.17.jar、logback-classic-1.1.2.jar、logback-core-1.1.2.jar、slf4j-api-1.7.12.jar、slf4j-jcl-1.7.12.jar、slf4j-simple-1.7.12.jar
使用SLF4J的关键在于,通过在项目中引入`slf4j-api.jar`,然后根据实际需求选择合适的日志实现(如logback或log4j),并通过相应的适配器(如`slf4j-log4j12.jar`)桥接SLF4J接口与具体日志框架。这样,如果将来需要...
<artifactId>jcl-over-slf4j <version>1.7.13 <scope>runtime <groupId>org.apache.logging.log4j <artifactId>log4j-api <version>2.4.1 <groupId>org.apache.logging.log4j <artifactId>log4j-core ...
NULL 博文链接:https://tristan-s.iteye.com/blog/1966020
- **其他绑定**:SLF4J还支持其他日志系统,如log4j-over-slf4j.jar(Log4j到SLF4J的桥接)、jcl-over-slf4j.jar(Jakarta Commons Logging到SLF4J的桥接)等。 3. **SLF4J的优势** - **灵活性**:SLF4J允许在不...
- 可选的适配器JAR,例如:`jcl-over-slf4j-1.4.3.jar` 或 `log4j-over-slf4j-1.4.3.jar`,取决于你的需求。 **示例代码**: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ...
SLF4J(Simple Logging Facade for Java)是Java中一个简单日志 facade,它为各种日志框架提供了一个统一的接口,如Log4j、java.util.logging、Logback等。这个接口允许开发者在部署时选择合适的日志实现,而无需...
- **log4j-over-slf4j.jar**:用于替换Log4J,需要注意的是,原有的`log4j.properties`配置文件将不再有效,需要转换为`logback.xml`。 - **jul-to-slf4j.jar**:用于替换JDK自带的日志系统,需要在程序启动时调用`...
Logback是SLF4J的推荐日志实现,因为它与SLF4J有紧密的集成,而且性能优于许多其他日志框架。 在使用桥接器时,通常需要做以下步骤: 1. **移除或替换旧的日志实现**:如果项目中已经存在commons-logging的实现,...
7. **迁移友好**:通过 SLF4J,可以轻松地将现有的 JUL、JCL 或 log4j 日志调用迁移到 LogBack,无需更改一行代码。只需使用适当的桥接器,LogBack 就能接管这些日志系统。 8. **API 简洁性**:LogBack 的 API 设计...
快速了解常用日志技术(JCL、Slf4j、JUL、Log4j、Logback、Log4j2)-附件资源
7. **jcl-over-slf4j.jar** (可选): Jakarta Commons Logging (JCL) 的桥接器,使得使用JCL的日志调用可以通过SLF4J来路由到Log4j。 8. **logback-classic.jar**: 如果使用了SLF4J,而日志实现选择的是Logback,...
- 其他可能需要的依赖,例如 JCL-over-SLF4J(Jakarta Commons Logging)的桥接器,以便将使用 JCL 的库的日志输出重定向到 SLF4J。 **4. 配置与使用** 在使用 Logback 时,你需要创建一个 `logback.xml` 或 `...