Logger vs. System.out.println - PullRequest
       20

Logger vs. System.out.println

40 голосов
/ 01 мая 2010

Я использую плагин PMD для затмения, и он выдает ошибку при использовании System.out.println() с объяснением:

Система. (Out | err) .print используется, рассмотрите возможность использования регистратора.

Мой вопрос - что такое регистратор? Как это используется для печати на экран? Почему это лучше?

Ответы [ 6 ]

28 голосов
/ 01 мая 2010

См. это краткое введение в log4j .

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

Однако, если вы законно используете System.out для печати информации пользователю, вы можете проигнорировать это предупреждение.

11 голосов
/ 01 мая 2010

Если вы используете System.out | err.println (..) для распечатки информации о пользователе на консоли в методе main () вашего приложения, вы ничего не делаете неправильно. Вы можете избавиться от сообщения, вставив комментарий "// NOPMD".

System.out.println("Fair use of System.out.println(..).");// NOPMD

Для этой цели в наброске нарушений PMD имеется опция «Пометить как проверенную».

Конечно, вы можете обмануть PMD с помощью следующего фрагмента кода:

PrintStream out=System.out;
out.println("I am fooling PMD.");  

Вне вашего main () - метод использует Log-систему, например, Log4j.

UPDATE:

Вы также можете изменить правило PMD "SystemPrintln", чтобы использовать следующий XPath:

//MethodDeclaration[@MethodName!="main"]//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
] | //Initializer//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]

Это будет игнорировать System.out.println и т. Д. В любом методе с именем 'main' в вашем коде, но проверьте наличие System.out.println в коде инициализатора. Мне это нравится, потому что, с моей точки зрения, System.out.println безопасен в методе main (String args []). Но используйте с осторожностью, я должен проверить, где в AST может также возникнуть System.out.println и должен адаптировать XPath.

5 голосов
/ 18 декабря 2013

Loggers имеет несколько уровней для ведения журнала.

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

Профессиональные регистраторы обеспечивают разные уровни регистрации и гибкости. Мы можем получить сообщение журнала соответственно. Например, сообщения группы X должны быть напечатаны только в PRODUCTION, сообщения группы Y должны быть напечатаны в ERROR и т. Д.

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

5 голосов
/ 01 мая 2010

Эта ссылка предоставляет более краткую информацию о том, как использовать Log4j: Не используйте System.out.println! Однако у него есть только один маленький недостаток, вы не должны помещать библиотеку в /jre/lib/ext , но только в пути к классам приложения и отправьте его вместе.

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

Существует несколько реализаций регистратора, например, встроенная в Java SE java.util.logging.Logger, удобная Apache Commons Logging , популярная Apache Log4j , ее преемник Logback и т. Д. Вы можете использовать Slf4j в качестве дополнительного уровня абстракции для переключения между любыми из этих регистраторов при необходимости.

4 голосов
/ 01 мая 2010

Похоже, что PMD предполагает, что вы звоните System.out.println() для целей отладки; такие вещи, как "Я в вашем методе, выполняю ваш код".

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

Если, однако, вы делаете консольное приложение и вызываете System.out как часть этого, игнорируйте предупреждение.

0 голосов
/ 01 мая 2010

System.out.println не подходит для использования, так как его невозможно настроить. Вместо этого, Logger можно настроить для входа на различные уровни. У него много других функций.

...