`
banxi1988
  • 浏览: 154562 次
  • 性别: 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+logback1.3.0

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

    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等...

    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日志相关jar包

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

    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...

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

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

    slf4j最新jar包下载和jar包

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

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

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

    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