`

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()方法。

相关推荐

Global site tag (gtag.js) - Google Analytics