Java日志系统学习之slf4j!

大大小小的项目或者框架用到都有用到日志。但自己都是一知半解。
今天又要配置框架,下下决心好好学习总结下!

1. slf4j。
[url=http://www.slf4j.org/]http://www.slf4j.org/[/url]
直接上官网直接学习。
上网查各种资料不是过时了,就是你抄我,我抄你。看起来没什么意思。
直接看用户手册。
1.1 最简单的使用方法 。在类路径上添加slf4j-api.jar和slf4j-simple.jar


package edu.guet.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloLog {
private static final Logger log = LoggerFactory.getLogger(HelloLog.class);
public static void main(String[] args) {
log.info("hello,world");

}
}
/***
输出结果:
0 [main] INFO edu.guet.log.HelloLog - hello,world
**/




slf4j点位符,及日志级别:

package edu.guet.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestLogPlaceHolder {
private static final Logger log = LoggerFactory.getLogger(TestLogPlaceHolder.class);

private String name;
private int id;

public static void main(String[] args) {
TestLogPlaceHolder holder = new TestLogPlaceHolder();
holder.setName("banxi");
}

public void setName(String name) {
String oldName = name;
this.name = name;
log.debug("name set to {},old name is {}",name,oldName);
log.warn("name set to {},old name is {}",name,oldName);
log.error("name set to {},old name is {}",name,oldName);

if(name.equals("banxi")){
log.info("welcome,{} is coming",name);
}


}
}
/***
日志输入结果:
1 [main] WARN edu.guet.log.TestLogPlaceHolder - name set to banxi,old name is banxi
2 [main] ERROR edu.guet.log.TestLogPlaceHolder - name set to banxi,old name is banxi
2 [main] INFO edu.guet.log.TestLogPlaceHolder - welcome,banxi is coming

***/



分析,slf4j可以使用{}作为点位符。默认情况下。debug级别的输出不显示。
日志级别。
error>warn>info>debug

使用点位符是因为它可以提高性能。
测试如下:

// 使用点位符的情况:
long beginTime = System.nanoTime();
log.debug("name set to {},old name is {}",name,oldName);
long endTime = System.nanoTime();
log.info("placeholder spend time {}",(endTime - beginTime));
//输入使用时间:
//2 [main] INFO edu.guet.log.TestLogPlaceHolder - placeholder spend time
8334




// 不使用点位符的情况
long beginTime = System.nanoTime();
log.debug("name set to"+name+",old name is"+oldName);
long endTime = System.nanoTime();
log.info("placeholder spend time {}",(endTime - beginTime));
// 日志输出如下:
1 [main] INFO edu.guet.log.TestLogPlaceHolder - placeholder spend time 42742


一个是8334一个是42742。在实际上并不输入debug级别的情况下。使用点位符的性能是不使用的5倍。

再来测试下都是info级别,即要输入的情况下。性能比较:

// 这一次先是不使用点位符的代码
long beginTime = System.nanoTime();
log.info("name set to"+name+",old name is"+oldName);
long endTime = System.nanoTime();
log.info("placeholder spend time {}",(endTime - beginTime));
// 日志输出如下:
0 [main] INFO edu.guet.log.TestLogPlaceHolder - name set tobanxi,old name isbanxi
3 [main] INFO edu.guet.log.TestLogPlaceHolder - placeholder spend time 394765



// 使用点位符的情况:
long beginTime = System.nanoTime();
log.info("name set to{},old name is{}",name,oldName);
long endTime = System.nanoTime();
log.info("placeholder spend time {}",(endTime - beginTime));

2 [main] INFO edu.guet.log.TestLogPlaceHolder - name set tobanxi,old name isbanxi
3 [main] INFO edu.guet.log.TestLogPlaceHolder - placeholder spend time 2342676


一个是2342676一个是394765
性能的差异也是5倍的样子。这个是可以理解的。因为String的连接已经有了优化。而使用点位符还要做解析。

静态?一个类的日志成员的变量,是声明为静态的好呢,还是实例的好呢?
他们各有好处。
主要区别在于,将Logger成员声明为静态的,性能及内存方面有优势。但实例型的Logger则是IOC友好的。
详细的说明参考slf4j的说明:
[url=http://www.slf4j.org/faq.html#logging_performance]http://www.slf4j.org/faq.html#logging_performance[/url]

在spring的项目中使用各种的日志系统。
所以 配置spring框架使用的日志时,和自己利用slf4j和log4j的话需要以下日志包:
slf4j-api-version.jar
slf4j-log4j12-version.jar
jcl-over-slf4j-version.jar
log4j-1.2.16.jar

先去吃饭先。。。。

又到晚上了。上面说spring用到了那么多的日志系统。作为证据我得把他们找出来。

1. jcl

//在org.springframework.web.servlet.DispatcherServlet类导入类。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


2. log4j 用spring-mvc的模板就会看到有log4j.xml文件了。

3.slf4j
在某处源代码有,当时看到了,现在找不到了。不过可以确定Spring-OSGi上有。在slf4j的网站上就有。

slf4j与其它日志系统的搭配看官网上的一张图就可以了。
如下:
[url=http://www.slf4j.org/images/concrete-bindings.png]点击查看图片[/url]

如果在iteye上已经有很多人对于java的日志系统有所总结,而且很多不错。
比如。
[url=http://www.iteye.com/topic/934593]java日志,需要知道的几件事[/url]
对于可能出现的错误如:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
则是因为没有找到合适的slf4j绑定。

未完待续-------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值