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

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

System.err.println( "Игнорируется эта база данных" );

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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