Search code examples
javaloggingproduction-environment

java : Using printStackTrace in Production Environment


I am going to deploy our Web Application under Production server. Is including printStackTrace under catch block in production environment acceptable? (becuase the logs under catch block doesn't help to know the exact cause for the error) So please tell me if is it aceptable to have printStackTrace under catch block?

For instance, I purposefully put an invalid port number and printStackTrace() gives me this information.

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)

Log style :

And where as the log gives this (I am using Apache commons logging mechanism for 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

So please tell me if is it acceptable to have printStackTrace under catch block?


Solution

  • The log will show the stacktrace as well, but you're not using it correctlly. Try:

    log.error(Object message, Throwable t);
    

    When you do Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO); the plus sign used as String concatenator will in fact call the toString() method on the e object, and append that to the "**EXCEPTION INSIDE execute " String, never getting a change to get to the exception object or it's stack trace.

    http://commons.apache.org/logging/guide.html#Logging a Message