资讯专栏INFORMATION COLUMN

Java打印完整的堆栈信息

aikin / 1563人阅读

摘要:我们在编写一些组件时,使用的日志系统有时并不能打印完整的堆栈信息,比如我们在调用打印异常时,只打印一行异常信息。

Java print full StackTrace

我们在编写一些组件时,使用的日志系统有时并不能打印完整的堆栈信息,比如slf4j,log4j,我们在调用log.error("found error ...",e)打印异常时,只打印一行异常信息。我们看下slf4j的源码

 /**
   * Log an exception (throwable) at the ERROR level with an
   * accompanying message.
   *
   * @param msg the message accompanying the exception
   * @param t   the exception (throwable) to log
   */
  public void error(String msg, Throwable t);

它在打印exception时,只是打印了堆栈当中的第一行Throwable的信息, 而我们想要的是把整个堆栈都打印出来,这时我们会用下面方式打印堆栈信息。

 e.printStackTrace()

这虽然打印了完整的堆栈信息,但它并不会把堆栈信息定向到日志文件中,这时我们就需要利用利用输出流把信息重新定到变量中,然后再送入到日志系统中

/**
     * 完整的堆栈信息
     *
     * @param e Exception
     * @return Full StackTrace
     */
    public static String getStackTrace(Exception e) {
        StringWriter sw = null;
        PrintWriter pw = null;
        try {
            sw = new StringWriter();
            pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            pw.flush();
            sw.flush();
        } finally {
            if (sw != null) {
                try {
                    sw.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (pw != null) {
                pw.close();
            }
        }
        return sw.toString();
    }

然后我们这样调用就解决了这个问题

log.error("fount error...", getStackTrace(e))

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64674.html

相关文章

  • Java进程CPU占用率100%问题排查

    摘要:指的是占用了一个核心,两个核心是,以此类推。占用率及对应进程可以通过命令确定,在界面按显示完整的命令行参数,按显示每个核心的统计数据。查看线程堆栈,找到对应的类及行号,然后阅读代码查找可能的问题原因。 100%指的是占用了CPU一个核心,两个核心是200%,以此类推。CPU占用率及对应进程ID(pid)可以通过top命令确定,在top界面按 c (显示完整的命令行参数),按 1 (显示...

    cyrils 评论0 收藏0
  • jvm调优

    摘要:一内存调优主要的目的是减小的频率和的次数。调优工具之主要用来输出中运行的进程状态信息。调优工具之和用来查看堆内存使用状况,一般结合使用。 一、jvm内存调优 主要的...

    snowLu 评论0 收藏0
  • Java日志正确使用姿势

    摘要:但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的发生,作为一名严谨的程序员,怎么能让这种事情发生呢所以下面我们就来了解一下关于日志的那些正确使用姿势。级别表示出现了严重错误,程序将会中断执行。 前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中尽情的打印我们需要的信息了。但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发...

    UCloud 评论0 收藏0
  • Java线程堆栈分析

    摘要:线程堆栈最擅长与分析如下类型问题系统无缘无故过高。性能瓶颈如无法充分利用等线程死锁死循环,饿死等。由于线程数量太多导致系统失败如无法创建线程等。注意死锁的两个或多个线程是不消耗的,有的人认为的使用率是线程死锁导致的,这个说法是完全错误的。 不知觉间工作已有一年了,闲下来的时候总会思考下,作为一名Java程序员,不能一直停留在开发业务使用框架上面。老话说得好,机会是留给有准备的人的,因此...

    jerry 评论0 收藏0
  • 从JS引擎理解Await b()与Promise.then(b)堆栈处理

    摘要:对于引擎来说,两者获取堆栈的方式是不同的。对于引擎来说,堆栈信息附加在了函数所返回的并在链中传递,这样函数也能在需要的时候获取堆栈信息。使用可以实时监控线上应用的错误,并获取完整的堆栈信息。 译者按: Async/Await真的只是简单的语法糖吗?No! 原文:Asynchronous stack traces: why await beats .then() 作者: Math...

    ziwenxie 评论0 收藏0

发表评论

0条评论

aikin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<