Что не так с использованием System.err в Java? - PullRequest
11 голосов
/ 26 июня 2009

Я использую инструмент статического анализа кода Enerjy (http://www.enerjy.com/)) в моем Java-коде. Он сообщает, что следующая строка:

System.err.println («Игнорировать эту базу данных»);

плохо, потому что использует System.err. Точная ошибка: «Использование JAVA0267 System.err»

Что не так с использованием System.err?

Ответы [ 7 ]

22 голосов
/ 26 июня 2009

Краткий ответ: считается плохой практикой использовать его для регистрации.

Это наблюдение, что в старые времена, когда не было общедоступных / общепринятых сред ведения журналов, каждый использовал System.err для вывода сообщений об ошибках и трассировки стека на консоль. Этот подход может быть подходящим на этапе разработки и локального тестирования, но не подходит для производственной среды, поскольку вы можете потерять важные сообщения об ошибках. Из-за этого сегодня почти во всех инструментах статического анализа этот вид кода обнаруживается и помечается как плохая практика (или проблема с аналогичным названием).

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

Самым очевидным (и без внешних зависимостей) разрешением hack является использование встроенной инфраструктуры Java Logging через класс java.util.logging.Logger, поскольку он по умолчанию передает события регистрации в консоль. Например:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(или вы можете просто отключить эту опцию анализа)

7 голосов
/ 26 июня 2009

Хотя я согласен с приведенными выше пунктами об использовании каркаса ведения журналов, я все же склонен использовать вывод System.err в одном месте: в отключающих хуках. Это потому, что я обнаружил, что при использовании java.util.logging каркасные операторы журнала не всегда отображаются, если они встречаются в перехватывающих хуках. Это связано с тем, что библиотека журналов, по-видимому, содержит собственный хук завершения работы для очистки файлов журналов и других ресурсов, и поскольку вы не можете полагаться на порядок запуска хуков завершения работы, вы не можете полагаться на операторы java.util.logging, работающие должным образом.

Проверьте эту ссылку (раздел «Комментарии») для получения дополнительной информации об этом.

http://weblogs.java.net/blog/dwalend/archive/2004/05/shutdown_hooks_2.html

(Очевидно, что другой альтернативой является использование другой среды ведения журналов.)

7 голосов
/ 26 июня 2009

дескриптор вашей ошибки:

Использование System.err может указывать на остаточный код отладки или шаблон. Рассмотрите возможность использования полнофункциональный пакет журналов, такой как Apache Commons, для обработки журналов ошибок.

Похоже, что вы используете System.err для ведения журнала, что является неоптимальным по нескольким причинам:

  • невозможно включить ведение журнала во время выполнения без изменения двоичного файла приложения
  • поведение при ведении журнала невозможно контролировать, отредактировав файл конфигурации
  • вероятно, многие другие
2 голосов
/ 26 июня 2009

System.err действительно больше подходит для целей отладки, чем что-либо еще. Предпочтительной является правильная обработка исключений и обработка ошибок более удобным для пользователя способом. Если пользователь должен увидеть ошибку, используйте вместо нее System.out.println.

Если вы хотите отслеживать эти ошибки с точки зрения разработчика, вам следует использовать регистратор.

1 голос
/ 26 июня 2009

System.err.println и System.out.println не должны использоваться в качестве logging-интерфейса. STD-Output и STD-Error (они написаны System.out и .err) предназначены для сообщений от инструментов командной строки.

1 голос
/ 26 июня 2009

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

System.err и System.out для неконсольных приложений видны только разработчику, выполняющему код в своей IDE, и полезная информация может быть потеряна, если элемент запущен в производство.

0 голосов
/ 26 июня 2009

System.err выводит на консоль. Это может подходить для студента, тестирующего домашнюю работу, но не подходит для приложения, в котором эти сообщения не будут видны (консоль хранит только столько строк).

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

...