如果你';在数据库中保存Java异常信息时,应该保存异常的哪些部分来帮助解决问题,而不需要冗余?

如果你';在数据库中保存Java异常信息时,应该保存异常的哪些部分来帮助解决问题,而不需要冗余?,java,exception-handling,Java,Exception Handling,java.lang.Exception对象的哪些部分需要保存在数据库中,以便您有最好的机会重新创建导致抛出异常的问题 如果一起保存,哪些部分会产生冗余信息 例如,如果您保存调用exception.getMessage()的结果,并且还保存了exception.getCause().getMessage(),您会得到重复的信息吗 而且,如果保存exception.getMessage,还保存exception.printStackTrace())的输出是否多余?我的策略是保存异常的时间戳和堆栈跟踪

java.lang.Exception
对象的哪些部分需要保存在数据库中,以便您有最好的机会重新创建导致抛出异常的问题

如果一起保存,哪些部分会产生冗余信息

例如,如果您保存调用
exception.getMessage()
的结果,并且还保存了
exception.getCause().getMessage()
,您会得到重复的信息吗


而且,如果保存
exception.getMessage
,还保存
exception.printStackTrace()
)的输出是否多余?

我的策略是保存异常的时间戳和堆栈跟踪


这是尝试诊断引发异常的问题所需的最重要的事情。

我认为您应该保存:

  • 堆栈跟踪
  • 信息
  • 时间戳
printStackTrace对于getMessage是多余的。看看代码:

    public void printStackTrace(PrintWriter s) {
    synchronized (s) {
        s.println(this);
        StackTraceElement[] trace = getOurStackTrace();
        for (int i=0; i < trace.length; i++)
            s.println("\tat " + trace[i]);

        Throwable ourCause = getCause();
        if (ourCause != null)
            ourCause.printStackTraceAsCause(s, trace);
    }
}

public String toString() {
    String s = getClass().getName();
    String message = getLocalizedMessage();
    return (message != null) ? (s + ": " + message) : s;
}
public void printStackTrace(PrintWriter s){
已同步{
s、 println(本);
StackTraceElement[]trace=getOurStackTrace();
对于(int i=0;i
为什么异常需要存在于数据库中?它们不能作为应用程序日志文件的一部分进行记录吗?log4j记录器有漂亮的异常打印,包括完整的堆栈跟踪、原因、时间戳等。这可能就是您所需要的。

在数据库中保存错误数据通常只用于进一步分析此类数据。从这个角度来看,我建议您对自己的异常进行一定的分类。例如,给他们分配一些错误代码。某些特定错误代码应专用于未知异常。现在,将错误代码和异常消息(最好在单独的列中)保存到数据库中。对于未知的异常,我会考虑调用<代码> toStrug()/<代码>,其中包括异常类和消息。堆栈跟踪最好属于日志。但为了更容易地找到它,在数据库中包含一些信息,比如请求id,这样可以方便地在日志中搜索堆栈跟踪

为什么要保存在数据库中?为什么不直接注销并保存日志文件呢?这将保留更多关于错误的上下文,而不仅仅是存储异常。此外,一些日志框架可以配置数据库附加器,因此如果愿意,您仍然可以在数据库中存储信息。如果我们保存整个堆栈跟踪,你不认为我们会有超过这个限制的时候吗?