`

Log4j 打印堆栈信息

阅读更多

      前几天同事突然问了个问题让我不大理解,先在这里记录下。

     1.log4j.error和e.printstacktrace()有什么区别?

    

      我的理解当然很简单,e.printstacktrace()是在控制台输出来的,logger4j是在日志中输出来的。

  后来同事打了个哑谜还有一个是关系到buffer上的区别,对于这点其实我还是没有怎么搞明白,有知道的小伙伴可以来解答下。


    2.logger.error(exception)和logger.error("",exception) 看很多人都是后者的写法,为什么就不能直接用logger.error(exception)呢?

    对于这个问题我们可以对比下输出结果就知道了,发现前者只打印一行报错信息,后者却可以打印出堆栈信息。其实这个问题可以在源码中探索出来。原来前者只把excetion.toString()当成message,异常信息设置成null了。

  

 /**
    Log a message object with the {@link Level#ERROR ERROR} Level.

    This method first checks if this category is ERROR
    enabled by comparing the level of this category with {@link
    Level#ERROR ERROR} Level. If this category is ERROR
    enabled, then it converts the message object passed as parameter
    to a string by invoking the appropriate {@link
    org.apache.log4j.or.ObjectRenderer}. It proceeds to call all the
    registered appenders in this category and also higher in the
    hierarchy depending on the value of the additivity flag.

    WARNING Note that passing a {@link Throwable} to this
    method will print the name of the Throwable but no
    stack trace. To print a stack trace use the {@link #error(Object,
    Throwable)} form instead.

    @param message the message object to log */
  public
  void error(Object message) {
    if(repository.isDisabled(Level.ERROR_INT))
      return;
    if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))
      forcedLog(FQCN, Level.ERROR, message, null);
  }

  /**
   Log a message object with the ERROR level including
   the stack trace of the {@link Throwable} t passed as
   parameter.

   See {@link #error(Object)} form for more detailed information.

   @param message the message object to log.
   @param t the exception to log, including its stack trace.  */
  public
  void error(Object message, Throwable t) {
    if(repository.isDisabled(Level.ERROR_INT))
      return;
    if(Level.ERROR.isGreaterOrEqual(this.getEffectiveLevel()))
      forcedLog(FQCN, Level.ERROR, message, t);

  }




   具体的demo代码如下:

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.log4j.Logger;


public class TestLogger {

	private Logger logger=Logger.getLogger(TestLogger.class);
	
	
	public static void main(String[] args) {
		
		File file=new File("d:\\adfasf.txt");
		try {
			InputStream input=new FileInputStream(file);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			new TestLogger().getLogger().info(e.toString());
			new TestLogger().getLogger().error(e);
//			new TestLogger().getLogger().error("error:",e);
		}
		
		
	}


	public Logger getLogger() {
		return logger;
	}


	public void setLogger(Logger logger) {
		this.logger = logger;
	}
	
	
	
}


    log4j的简单配置可以参考:http://blog.csdn.net/shuhuiguo0915/article/details/6442566

 

0
0
分享到:
评论
2 楼 labreeze 2015-12-18  
renzhengzhi 写道

实际是因为Exception是Throwable的子类,而logger类中对应的第二个参数为Throwable类型的方法只有error(String msg, Throwable t) 和error(Marker marker, String msg, Throwable t)。其他方法都将参数作为object类型,调用其toString()方法。


确实,这个是本质原因
1 楼 renzhengzhi 2015-12-17  

实际是因为Exception是Throwable的子类,而logger类中对应的第二个参数为Throwable类型的方法只有error(String msg, Throwable t) 和error(Marker marker, String msg, Throwable t)。其他方法都将参数作为object类型,调用其toString()方法。

相关推荐

    Log4j打印堆栈信息类

    用于Log4j,apache Logger打印堆栈信息 由于网上没这一部分信息,自己就把它写出来了 其实也就短短几句代码 在捕捉异常的时候使用该类即可

    浅谈log4j 不打印异常堆栈

    JVM 优化机制可能会导致log4j 不打印异常堆栈,但是这并不意味着我们不能获取异常堆栈信息。通过禁用 JVM 优化机制,我们可以获取完整的异常堆栈信息。 知识点6: log4j 配置的重要性 log4j 的配置对日志记录的...

    无法打出log4j日志的问题排查

    在IT行业中,日志记录是调试和监控应用程序的关键部分,特别是对于Java开发者而言,Log4j是一个非常常用的日志框架。当我们遇到“无法打出log4j日志的问题”,这通常是由于配置、环境或代码实现中的某些错误导致的。...

    log4j-1.2.17

    4. **异常堆栈追踪**:在ERROR级别下,log4j会自动打印出完整的异常堆栈信息,方便排查错误。 总结,log4j-1.2.17作为一个成熟的日志框架,其强大功能和灵活性使得开发者能够方便地管理和分析应用程序的运行状态。...

    log4j使用实例.zip

    **Java日志框架Log4j详解** 在Java开发中,日志记录是不可或缺的一部分,它帮助开发者追踪程序运行状态、定位错误以及优化性能。Log4j是Apache组织提供的一款强大的日志工具,广泛应用于各种Java应用程序。这个"log...

    log4j自定义

    2. **自定义日志输出格式**:默认情况下,Log4j会打印出时间戳、日志级别、logger名和日志消息。我们可以通过自定义`Layout`实现,例如创建一个XML布局或者JSON布局,使得日志输出更符合项目需求。 3. **自定义日志...

    log4j日志记录对于exception的记录问题

    这样不仅会打印出错误消息,还会将堆栈跟踪信息一并记录,这对于调试非常有用。 总的来说,理解和熟练使用Log4j对于exception的记录,可以帮助开发者更有效地监控应用程序,及时发现和解决潜在的问题。通过学习提供...

    android slf4j log4j日志框架

    通常,这些示例会展示如何导入SLF4J的依赖,创建Logger实例,并使用不同的日志级别打印信息。例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ExampleClass { private ...

    Log4j中文手册

    **Log4j中文手册概述** Log4j是Java编程语言中的一个强大且灵活的日志记录框架,由Apache软件基金会开发并维护。它为开发者提供了一种高效、可配置的方式来记录应用程序运行过程中的各种信息,包括错误、警告、调试...

    Log4使用实例精髓部分

    - `Log4JDemo01`通常是最基础的示例,展示了如何在代码中引入Log4j并打印简单日志。 - `Log4JDemo02`和`Log4JDemo03`可能涉及到不同级别的日志输出,演示了如何根据需要调整日志级别。 - `Log4JDemo04`可能讲解了...

    Log4j自已配置

    例如,`log4j.filter.Threshold=DEBUG`会确保只有DEBUG级别及以上的日志被打印。 - 日志级别是日志严重程度的分类,从低到高依次为TRACE、DEBUG、INFO、WARN、ERROR和FATAL。根据项目需求,可以选择性地记录不同...

    log4 打印日志文件例子

    它由Apache软件基金会开发,是Log4j的升级版,提供更高效、灵活的日志记录功能。Log4 的主要目标是使应用程序的调试、监控和维护变得更加简单,通过控制台输出、文件记录、网络传输等方式,收集和管理运行时的信息。...

    Java将Exception信息转为String字符串的方法

    这样 log 日志中就会直接打印出异常堆栈中的全部信息。但是,如果你使用的是 `logger.error("异常信息:"+e.toString())` ;这种形式,它只会输出异常的名称,而不会有详细信息。 解决方法二:使用 StringWriter 这...

    日志记录(log4j等)介绍

    Log4j的另一个关键特性是配置文件(通常是log4j.properties或log4j.xml),通过这个文件,开发者可以定义日志输出的位置(控制台、文件、网络等)、格式(日期、线程名、级别、类名等)以及过滤规则。例如,你可以...

    Android高级应用源码-Android开发的日记打印工具类Log4jForAndroid和LogUtil.zip

    - 使用:引入`Log4jForAndroid`库后,通过配置文件可以设定各种参数,然后在代码中调用`org.apache.log4j.Logger`的相关方法进行日志记录。 3. **LogUtil** - `LogUtil`通常是一个自定义的日志工具类,它封装了`...

    轻量、易集成、易使用,有时甚至可以不需写代码的HarmonyOS log系统,灵感来自log4j

    轻量、易集成、易使用,有时甚至可以不需写代码的HarmonyOS log系统,灵感来自log4j。支持TS工程引入。提供日志装饰器,无需自己配置log4a,自动跟踪函数调用情况。使用fatal、error输出时,支持打印调用堆栈。支持...

    log4日志j的使用

    Log4j是Java编程语言中广泛使用的日志记录框架,它为应用程序提供了灵活的日志记录功能,便于调试、性能分析和系统监控。Log4j包括三个主要组件:配置器(Configurator)、日志器(Logger)和输出端(Appender)。在...

    slf4j完整日志文件

    `,这会自动打印异常堆栈信息。 **8. 性能优化** 在生产环境中,应根据需求调整日志级别,减少不必要的日志输出以提升性能。 总结,SLF4J是Java日志管理的重要工具,通过提供统一的API,使得开发者可以在不改变...

    Android Studio 多模式Log打印

    5. **异常处理**:当捕获到异常时,自动打印堆栈信息,这对于排查错误非常有帮助。 6. **日志裁剪**:对于长字符串,可以自动截断并在末尾添加省略号,避免因单条日志过长导致日志系统崩溃。 7. **日志文件保存**...

    log4net详细说明及实例

    log4net是一款广泛应用于.NET开发中的日志记录工具,它借鉴了Java中的log4j,提供了强大的日志管理功能,为开发者提供了灵活、可扩展的日志记录解决方案。在.NET开发过程中,日志记录是不可或缺的调试和故障排查手段...

Global site tag (gtag.js) - Google Analytics