Java日志系统学习之slf4j! _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Java日志系统学习之slf4j!

Java日志系统学习之slf4j!

 2011/11/14 6:40:03  banxi1988  http://banxi1988.iteye.com  我要评论(0)
  • 摘要:大大小小的项目或者框架用到都有用到日志。但自己都是一知半解。今天又要配置框架,下下决心好好学习总结下!1.slf4j。http://www.slf4j.org/直接上官网直接学习。上网查各种资料不是过时了,就是你抄我,我抄你。看起来没什么意思。直接看用户手册。1.1最简单的使用方法。在类路径上添加slf4j-api.jar和slf4j-simple.jarpackageedu.guet.log;importorg.slf4j.Logger;importorg.slf4j
  • 标签:
大大小小的项目或者框架用到都有用到日志。但自己都是一知半解。
今天又要配置框架,下下决心好好学习总结下!

1. slf4j。
http://www.slf4j.org/
直接上官网直接学习。
上网查各种资料不是过时了,就是你抄我,我抄你。看起来没什么意思。
直接看用户手册。
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的说明:
http://www.slf4j.org/faq.html#logging_performance

在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与其它日志系统的搭配看官网上的一张图就可以了。
如下:
点击查看图片

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

未完待续-------
  • 相关文章
发表评论
用户名: 匿名