slf4j配置实例
来源:互联网 发布:京东抢券软件安卓 编辑:程序博客网 时间:2024/06/05 12:39
原文链接:http://blog.csdn.net/liweibin_/article/details/11984895
1、 简介
SLF4J不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
2、 什么情况下使用
如果你开发的是类库或者嵌入式组件,那么就应该考虑采用SLF4J,因为不可能影响最终用户选择哪种日志系统。在另一方面,如果是一个简单或者独立的应用,确定只有一种日志系统,那么就没有使用SLF4J的必要。假设你打算将你使用log4j的产品卖给要求使用JDK 1.4 Logging的用户时,面对成千上万的log4j调用的修改,相信这绝对不是一件轻松的事情。但是如果开始便使用SLF4J,那么这种转换将是非常轻松的事情。
3、 源码及jar包下载地址
http://www.slf4j.org/download.html
4、 调用举例
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Wombat {
final Logger logger = LoggerFactory.getLogger(Wombat.class);
Integer t;
Integer oldT;
public void setTemperature(Integer temperature) {
oldT = t;
t = temperature;
Object[] objs = {new java.util.Date(), oldT, t};
logger.info("Today is {}, Temperature set to {}. Old temperature was {}.", objs);
if (temperature.intValue() > 50) {
logger.warn("Temperature({}) has risen above 50 degrees.", t);
}
}
public static void main(String[] args) {
Wombat wombat = new Wombat();
wombat.setTemperature(10);
wombat.setTemperature(60);
}
}
5、 日志绑定原理
在应用中,通过LoggerFactory类的静态getLogger()获取logger。通过查看该类的代码可以看出,最终是通过StaticLoggerBinder.SINGLETON.getLoggerFactory()方法获取LoggerFactory然后,在通过该具体的LoggerFactory来获取logger的。类org.slf4j.impl.StaticLoggerBinder并不在slf4j-api-1.*.*.jar包中,仔细查看每个与具体日志系统对应的jar包,就会发现,相应的jar包都有一个org.slf4j.impl.StaticLoggerBinder的实现,不同的实现返回与该日志系统对应的LoggerFactory,因此就实现了所谓的静态绑定,达到只要选取不同jar包就能简单灵活配置的目的。
6、 日志系统的切换
编译上边的程序,需要classpath中加入slf4j-api-1.4.1.jar文件。
运行时,需要classpath中加上slf4j-simple-1.4.1.jar。
切换到jdk14的log的风格:只需要把slf4j-simple-1.4.1.jar从classpath中移除,同时classpath中加入slj4j-jdk14-1.4.1.jar
切换到log4j:同样移除slj4j-jdk14-1.4.1.jar,加入slf4j-log4j12-1.4.1.jar,同时加入log4j-1.2.x.jar加入log4j.properties。
-------------------------------------------------------------
内容简介:
本文主要介绍 在一个系统中如何通过log4j的配置文件配置出多个logger,使得该系统可以在不同路径下输出多个内容不同的log 文件。并通过该实例的实现过程进一步讲解log4j的一些特性。
具体内容:
1. 如何在项目中配置log4j使得该系统可以输出web test的日志文件(自定义格式)到工程dist目录下的junitLog/WebTestLog.log目录下,输出508 check日志(html格式)到c:/508log.html路径下?
第一步:加入log4j-1.2.8.jar到lib下。
第三步:根据需要修改log4j配置文件中的相应属性,修改之前就必须知道这些都是干什么的,在后面的部分具体讲解。
该实例中 根据需要 配好的log4j.properties如下:
第四步:在要输出日志的类中加入相关语句。
Note:由于Log4j中Logger具有java的继承特性,所以在这个实例中,为了实现‘com. testframework.web’包下的所有类都可以使用Appender A3将Error级别以上的信息输出到工程dist目录下的junitLog/WebTestLog.log日志文件中。所以在properties文件中用包名定义了一个logger
log4j.logger.com.testframework.web=ERROR,A3
且在java代码中用该包中的类名来加载logger
staticLogger logger = Logger.getLogger(PersonTest.class);
此时,在java代码中所加载的这个logger的名字是com.testframework.web.PersonTest, 根据继承原理,由于在log4j配置文件中没有定义这个logger的level和appender,所以这个logger将自动继承其父logger‘com.testframework.web’的level和appender设置。
对于log4j的java继承原理,后面的部分会详细介绍。
2. Log4j配置文件讲解
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。下面将介绍使用log4j.properties文件作为配置文件的方法。
2.1 配置根Logger
其中,level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别,只有等于及高于这个级别的才进行处理,则应用程序中所有DEBUG级别的日志信息将不被打印出来。ALL: 打印所有的日志,OFF:关闭所有的日志输出。 appenderName就是指定日志信息输出到哪个地方,可同时指定多个输出目的地。
2.2 配置日志信息输出目的地 Appender
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
这里的appenderName为在①里定义的,可任意起名。
org.apache.log4j.ConsoleAppender(控制台),
例如:log4j.appender.stdout=org.apache.log4j.ConsoleAppender
2.3 配置日志信息的格式(布局)Layout
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中,Log4j提供的layout有以下几种:
2.3.1格式化日志信息
3. Log4j的java特性简介
Log4j简单的来说由3部分组成: logger,appender,layout。
Logger之间是具有java的继承特性的。Log4j有一个rootLogger,所有普通logger都默认继承rootLogger。而普通logger之间的继承关系是通过logger name来实现的。
例如,叫"com.foo.Bar"名字的logger就继承于叫"com.foo"名字的logger。就好像java中"java.util" 和"java.util.Vector"的关系一样。
而这些继承关系决定了logger的Level和Appender这两个属性的确定。
请看下面的例子(继承关系对确定logger的Level的影响):
Logger
name
Assigned
level
Inherited
level
root
Proot
Proot
X
Px
Px
X.Y
none
Px
X.Y.Z
Pxyz
Pxyz
在上面例子中我们可以了解到如果一个普通logger定义了Level,则其level就使用它定义的(例如:logger X),如果没有定义,就使用其父logger的(例如:logger X.Y)。
请看下面的例子(继承关系对确定logger的Appender的影响):
Logger
Name
Added
Appenders
Additivity
Flag
Output Targets
Comment
root
A1
not applicable
A1
The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.
x
A-x1, A-x2
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y
none
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y.z
A-xyz1
true
A1, A-x1, A-x2, A-xyz1
Appenders in "x.y.z", "x" and root.
security
A-sec
false
A-sec
No appender accumulation since the additivity flag is set to false.
security.access
none
true
A-sec
Only appenders of "security" because the additivity flag in "security" is set to false.
在上面的例子中我们可以看出:
a. 如果一个普通logger定义Appender且其AdditivityFlag是true,则该logger的Appender包括其定义的Appender及其父logger定义的Appender。例如:logger‘x’。
b. 如果一个普通logger没有定义Appender,但其AdditivityFlag是true,则该logger的Appender为其父logger定义的Appender。例如:logger‘x.y’。
c. 如果一个普通logger定义了Appender,但其AdditivityFlag是false,则该logger的Appender只为其定义的Appender。例如:logger‘security’。
- slf4j配置实例
- slf4j配置实例
- slf4j配置实例
- slf4j配置实例
- slf4j配置实例
- slf4j配置实例
- slf4j配置实例
- slf4j配置
- SLF4J配置
- SLF4J配置
- SLF4J 集成log4j实例 注意要配置log4j.properties
- slf4j+logback 多个日志输出配置实例
- slf4j+logback实现多个日志输出配置实例
- logback+slf4j日志实例
- log4j logback slf4j配置
- slf4j和log4j配置
- log4j logback slf4j配置
- slf4j和log4j配置
- 通过串口log信息解决无限重启问题——空指针异常
- 2017开学训练第五周周中总结
- 解决CentOS下无法发送邮件的问题 + selinux
- 机器学习中的正则化
- Spring源码学习之认识AOP
- slf4j配置实例
- kafka可靠性
- jsp使用session对象模拟在线考试系统
- token android.os.BinderProxy@163442e0 is not valid; is your activity running
- InteliJ IDEA用Maven搭建Mybatis框架
- jQuery学习_动作效果(隐藏、显示、切换,滑动,淡入淡出,以及动画)
- POJ
- 据说这个说话的。。。。。。。那啥。
- taskctl自带工具splitexm功能及使用