Java: 在生产环境中使用printStackTrace

5

我将要在生产服务器上部署我们的Web应用程序。 在生产环境下,是否可以在catch块中包含printStackTrace?(因为在catch块下的日志无法帮助我们知道错误的确切原因) 请告诉我,在catch块下使用printStackTrace是否可接受?

例如,我故意放置了一个无效的端口号,并且printStackTrace()会给我提供这些信息。

printStackTrace() :

java.lang.IllegalArgumentException: port out of range:80800
        at java.net.InetSocketAddress.<init>(InetSocketAddress.java:118)
        at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
        at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
        at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)
        at sun.net.www.http.HttpClient.New(HttpClient.java:307)
        at sun.net.www.http.HttpClient.New(HttpClient.java:324)
        at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
        at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
        at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
        at com.tata.util.XmlClient.execute(HttpXmlClient.java:83)

日志样式:

而当使用 Apache Commons Logging 机制进行日志记录时,日志会像这样显示:

 Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO);

06/Jan/2012 16:25:55   - main:http-8080-2 <> <60990020>**EXCEPTION INSIDE execute  java.lang.IllegalArgumentException: port out of range:80800

请问在catch块中使用printStackTrace是否可行?
4个回答

5

日志还会显示堆栈跟踪,但您未正确使用它。请尝试:

log.error(Object message, Throwable t);

当您执行Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO);时,用作String连接器的加号实际上将调用e对象上的toString()方法,并将其附加到"**EXCEPTION INSIDE execute "字符串中,从未有机会到达异常对象或其堆栈跟踪。 记录消息

谢谢,那么我应该这样使用来处理这段代码吗?catch(Exception e){log.error(Object message, Throwable e)}; - user663724
没错,就这样用应该没问题。检查一下日志,看看是不是你需要的。记住,你可以随时使用Log4j配置来更改日志消息的格式:http://www.allapplabs.com/log4j/log4j_layouts.htm - Shivan Dragon

1

在你的生活应用程序中出现堆栈跟踪肯定是不好的。

为什么不为你的printStackTrace创建一个弹出窗口,并在某个调试标志处于活动状态时显示它(不确定在Java中如何实现)。

通常,您会让所有异常冒泡到需要处理它们的位置。连接错误可能是您想要在应用程序中显示的信息,因此您可以在前端处理它(例如,在弹出窗口中)。

Andrei Bodnarescu是正确的,修复记录器也可以解决问题。


你能否解释一下为什么生产应用程序日志中的堆栈跟踪是不好的?我持有相反的观点,特别是在某些情况下,你可能无法在开发环境中重现某些错误,因此,在生产环境中遇到奇怪的异常时,你会束手无策,不知道它为什么会发生。 - Jacek Prucia
我们认为,堆栈跟踪信息不应该对用户可见,因为它可能会揭示应用程序的内部工作原理,并导致安全风险。当然,您不能允许异常丢失。但是,与其将其显示给用户并让他决定如何处理,您应该在内部处理它,并将其记录在文件中或/和像我们一样发送异常电子邮件,可能包含更多信息,发送到开发人员定期检查的特殊异常电子邮件邮箱中。 - Pete

0

嗯,这种方法是记录日志的第一步,当问题出现时肯定会有所帮助。但是您可以使用像log4j或commons logger这样的日志库来改进它,设置应用程序以使用它们并输出额外的数据(DB查询,操作结果等),因此您将检索一些内容与堆栈跟踪一起,可能具有更好的格式。

此外,容器/ Web服务器记录跟踪通常会引起客户的疑虑,而具有结构化应用程序日志则使他们更加冷静。这是一个感知问题。


0

是的,在生产环境中打印异常的堆栈跟踪是可以接受的。 如果需要,您仍然可以将异常向上抛出以进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接