`
banxi1988
  • 浏览: 153901 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

Java日志系统学习之slf4j!

    博客分类:
  • java
阅读更多
大大小小的项目或者框架用到都有用到日志。但自己都是一知半解。
今天又要配置框架,下下决心好好学习总结下!

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绑定。

未完待续-------
分享到:
评论

相关推荐

    Java Slf4j依赖包

    2. `slf4j-jdk14-1.5.6.jar`:这是一个适配器模块,它使得Slf4j可以使用Java内置的日志系统(java.util.logging)作为其后台日志框架。如果你的应用环境中已经使用了Java内置的日志,那么这个适配器可以让Slf4j无缝...

    slf4j完整日志文件

    总结,SLF4J是Java日志管理的重要工具,通过提供统一的API,使得开发者可以在不改变代码的情况下灵活选择或切换日志实现。结合Log4j,我们可以实现强大的日志记录功能,方便调试和监控应用程序。在具体项目中,配置...

    使用Slf4j集成Log4j2构建项目日志系统的完美解决方案.docx

    1. 兼容性强:Slf4j可以与多种日志系统集成,如Log4j、Logback、Java Util Logging等。 2. 灵活性强:Slf4j提供了统一的日志接口,使得用户可以选择不同的日志实现。 3. 高性能:Slf4j可以在高并发情况下提供高性能...

    java slf4j

    总之,SLF4J作为Java日志的标准之一,以其简洁的API、强大的功能和高度的灵活性,为开发者提供了高效、便捷的日志处理方案。通过SLF4J,我们可以轻松地在不同的日志框架之间切换,同时保持代码的整洁和一致性。在...

    非web工程使用slf4j输出日志

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架,如Log4j、Logback等提供一个简单的接口,使得开发者能够在不改变代码的情况下更换日志实现。在非Web工程中,SLF4J同样扮演着...

    slf4j输入日志到mongodb

    SLF4J(Simple Logging Facade for Java)是Java中一个用于日志记录的抽象层,它提供了一种标准的日志记录接口,使得开发者可以选择不同的日志实现框架,如Log4j、Logback等。MongoDB则是一个流行的NoSQL数据库系统...

    log4j + slf4j-api + slf4j-log4j12

    slf4j-log4j12-1.7.x版本是SLF4J针对Log4j 1.2版本的绑定器,它使得应用可以使用SLF4J接口,但实际的日志输出通过Log4j进行。这个桥接器让项目能利用SLF4J的灵活性,同时使用Log4j的成熟实现。 在提供的文件名列表...

    调试日志之slf4j+logback

    本文将深入探讨“调试日志之slf4j+logback”的主题,这两个组件是Java开发中的常见日志解决方案。 SLF4J(Simple Logging Facade for Java)是一个日志门面,它为各种日志框架提供了统一的接口,如Log4j、Logback等...

    日志 log4j-slf4j+logback1.3.0

    SLF4J提供了一套简单的API,用于编写日志语句,然后在运行时通过绑定具体的日志实现(如Log4j、Java内置的日志系统等)来决定日志的行为。 Logback则是由Log4j的创始人Ceki Gülcü开发的一个更现代、更高效的日志...

    slf4j jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。这个jar包是SLF4J的核心组件,用于在应用...

    slf4j日志框架的源代码分享

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志门面(Logging Facade),它为各种日志框架提供了一个简单的统一接口,如Log4j、Java Util Logging、Logback等。通过SLF4J,开发者可以在运行时绑定任意...

    slf4j与其它日志api的结合

    描述中的"slf4j_and_slf4j_simple.png"可能展示了如何使用SLF4J最基础的功能,而"slf4j_and_slf4j_jdk.png"可能涉及了如何将SLF4J与Java内置日志系统集成。"slf4j_and_slf4j-log4j.png"则可能演示了如何配置SLF4J与...

    slf4j-log4j12-1.7.12.jar、slf4j-api-1.7.12.jar

    SLF4J提供了一种机制,通过在类路径中放置特殊的“禁止”JAR(如jul-to-slf4j.jar),可以防止Java Util Logging(JUL)等其他日志框架的直接使用,从而保持日志系统的统一。 标签"slf4j"表明了这两个JAR文件与SLF4...

    Slf4j日志相关jar包

    Slf4j(Simple Logging Facade for Java)是一个用于日志系统的简单 facade,它允许最终用户在部署他们的应用时使用他们希望的日志库。Slf4j提供了一个统一的API,使得开发人员能够在不更换日志实现的情况下,轻松地...

    java高级处理日志工具org.slf4j.jar

    java高级处理日志工具org.slf4j.jar,可以和org.slf4j.log4j结合起来使用

    slf4j-api.jar和slf4j-nop.jar打包下载

    总的来说,SLF4J的出现使得Java日志处理更加规范和模块化,开发者可以根据项目的特性选择最适合的日志实现,同时减少了不同日志库之间的代码冲突。通过使用SLF4J,我们可以编写出更加简洁、可维护的代码,提高了项目...

    slf4j最新jar包下载和jar包

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它提供了一个接口,允许用户在运行时动态地绑定到各种具体的日志框架,如Log4j、Java内置的日志或者Logback等。这个设计使得开发者可以在不修改...

    slf4j所需要的所有jar文件集合

    SLF4J(Simple Logging Facade for Java)是Java中的一种日志抽象层,它为各种日志框架提供了一个统一的API,如Log4j、Java Util Logging、Logback等。这个API允许开发者在部署应用时选择合适的日志实现,而无需修改...

    slf4j-api-1.7.7,slf4j-log4j12-1.7.7

    SLF4J的出现主要是为了解决Java日志API的碎片化问题,让应用的日志配置更加灵活。 标题中的"slf4j-api-1.7.7"指的是SLF4J API的1.7.7版本,它是SLF4J的核心组件,包含了SLF4J的日志API定义。这个库提供了日志记录的...

    slf4j-api-1.7.12.jar slf4j-log4j12-1.7.12.jar

    总结来说,SLF4J是一个重要的日志抽象层,它简化了Java日志处理,提高了代码的可维护性和可扩展性。`slf4j-api-1.7.12.jar`和`slf4j-log4j12-1.7.12.jar`分别是SLF4J API和SLF4J到Log4j的绑定,它们共同工作,使...

Global site tag (gtag.js) - Google Analytics