Подтвердить что ты не робот

Logger vs. System.out.println

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Для этой цели есть "Отметить как рассмотренный" -Общение в ППМ-Нарушения.

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

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

Вне вашего основного() - метода используется Log-System, например, 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 []) '. Но используйте с осторожностью, я должен проверить, где в АСТ может произойти также System.out.println и придется адаптировать XPath.

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Регистраторы имеют несколько уровней для ведения журнала.

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

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

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

Ответ 6

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