Published on

Java中如何使用log.error打印出异常的堆栈信息

Authors
  • avatar
    Name
    Jason Yang
    Twitter

在 Java 中,希望使用 log.error() 打印异常的完整堆栈信息,记录在日志文件里,而不是打印在控制台,如果直接记录ex.toString()或者ex.getMessage(),会丢失堆栈信息。

将堆栈信息转换为字符串

import java.io.PrintWriter;
import java.io.StringWriter;

public class Example {
    private static final Logger log = LoggerFactory.getLogger(Example.class);

    public void someMethod() {
        try {
            // 可能抛出异常的代码
            int result = 10 / 0;
        } catch (Exception e) {
            // 将堆栈信息转换为字符串
            StringWriter sw = new StringWriter();
            e.printStackTrace(new PrintWriter(sw));
            String stackTrace = sw.toString();

            // 记录错误日志
            log.error("An error occurred: " + stackTrace);
        }
    }
}

说明

  • 使用 StringWriterPrintWriter 将堆栈信息转换为字符串。

可以编写一个工具类来简化堆栈信息的处理。

public class ExceptionUtils {
    public static String getStackTraceAsString(Exception e) {
        StringWriter sw = new StringWriter();
        e.printStackTrace(new PrintWriter(sw));
        return sw.toString();
    }
}

// 使用工具类
try {
    // 可能抛出异常的代码
    int result = 10 / 0;
} catch (Exception e) {
    // 记录错误日志
    log.error("An error occurred: " + ExceptionUtils.getStackTraceAsString(e));
}

总结

  • 推荐方法:使用 StringWriterPrintWriter 将堆栈信息转换为字符串。
  • 避免方法:仅使用 e.toString()e.getMessage(),因为会丢失堆栈信息。