Регистратор по сравнению с System.out.println

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

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

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

41
задан Community 24 June 2016 в 13:59
поделиться

5 ответов

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

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

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

29
ответ дан 27 November 2019 в 00:49
поделиться

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

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

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

5
ответ дан 27 November 2019 в 00:49
поделиться

Если вы используете 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.");  

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

ОБНОВЛЕНИЕ:

Вы также можете изменить 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 etc в любом методе с именем 'main' в вашем коде, но проверьте System.out.println в коде инициализатора. Мне это нравится, потому что, с моей точки зрения, System.out.println безопасен в методе 'main(String args[])'. Но используйте с осторожностью, я должен проверить, где в AST system.out.println также может встречаться и придется адаптировать XPath.

11
ответ дан 27 November 2019 в 00:49
поделиться

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

0
ответ дан 27 November 2019 в 00:49
поделиться

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

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

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

4
ответ дан 27 November 2019 в 00:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: