Java: использование printStackTrace в производственной среде - PullRequest
4 голосов
/ 06 января 2012

Я собираюсь развернуть наше веб-приложение на производственном сервере.Допустимо ли использование printStackTrace под блоком catch в производственной среде?(потому что журналы в блоке catch не помогают узнать точную причину ошибки). Так скажите, пожалуйста, допустимо ли использовать printStackTrace в блоке catch?

Например, я специально установил неверный портnumber и 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)

 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

Так скажите, пожалуйста, допустимо ли использование printStackTrace в блоке catch?

Ответы [ 4 ]

6 голосов
/ 06 января 2012

Журнал также покажет трассировку стека, но вы не используете его правильно.Попробуйте:

log.error(Object message, Throwable t);

Когда вы сделаете Log.write("**EXCEPTION INSIDE execute " + e, Log.INFO); знак плюс, используемый в качестве конкатенации строк, фактически вызовет метод toString() для объекта e и добавит его к "**EXCEPTION INSIDE execute " строке, так и не получивизменение для получения объекта исключения или его трассировки стека.

http://commons.apache.org/logging/guide.html#Logging a Сообщение

1 голос
/ 06 января 2012

Наличие трассировки стека в вашем жизненном приложении, безусловно, плохо.

Почему бы вам не создать всплывающее окно для вашего printStackTrace и не отображать его, если активен определенный флаг отладки (не уверен, как это делается в java).

Обычно вы позволяете всем исключениям всплывать там, где вам нужно их обработать.Ошибка подключения может быть информацией, которую вы хотите отобразить в своем приложении, поэтому вы обрабатываете ее в своем интерфейсе (например, во всплывающем окне).

И Андрей Боднареску прав, исправляя свой регистратор, тоже добивается цели.

0 голосов
/ 06 января 2012

Да, допустимо печатать трассировки стека для исключений в производственных средах.Вы все равно можете выбросить исключение для обработки, если хотите.

0 голосов
/ 06 января 2012

Что ж, делать это таким образом - это первый подход к ведению журнала и, несомненно, он поможет решить проблемы, когда они появятся.Но вы можете улучшить это, используя библиотеки журналов, такие как log4j или commons logger, настроив свое приложение на их использование и вывод дополнительных данных (запросы к БД, результаты операций и т. Д.), Так что вы будете получать некоторые вещи вместе с трассировкой стека, возможно, с лучшейformat.

Кроме того, наличие журнала контейнеров / веб-сервера со следами часто вызывает сомнения у клиентов, в то время как наличие структурированного журнала приложений делает их более спокойными.Вопрос восприятия.

...