java:在生产环境中使用printStackTrace

时间:2012-01-06 11:19:29

标签: java logging production-environment

我将在生产服务器下部署我们的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日志记录机制进行日志记录)

 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 个答案:

答案 0 :(得分:6)

日志也会显示堆栈跟踪,但您没有正确使用它。尝试:

log.error(Object message, Throwable t);

执行Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO);时,用作字符串连接符的加号实际上会调用e对象上的toString()方法,并将其附加到"**EXCEPTION INSIDE execute "字符串,永远不会得到更改获取异常对象或它的堆栈跟踪。

http://commons.apache.org/logging/guide.html#Logging留言

答案 1 :(得分:1)

在你的生活应用程序中使用堆栈跟踪肯定是坏事。

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

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

Andrei Bodnarescu是对的,修理你的记录器也是有用的。

答案 2 :(得分:0)

嗯,这样做是第一种记录方法,当它们出现时肯定有助于解决问题。但是你可以使用log4j或commons logger之类的日志库来改进它,设置你的应用程序使用它们并输出额外的数据(数据库查询,操作结果等),这样你就可以在堆栈跟踪中检索一些东西,也许更好格式。

此外,使用带有跟踪的容器/ Web服务器日志通常会引起客户端的疑虑,而拥有结构化应用程序日志会让他们更加平静。感知问题。

答案 3 :(得分:0)

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