大大小小的项目或者框架用到都有用到日志。但自己都是一知半解。
今天又要配置框架,下下决心好好学习总结下!
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绑定。
未完待续-------