Logger vs. System.out.println
Я использую плагин PMD для затмения, и он дает мне ошибку при использовании System.out.println()
с объяснением:
Система.(Out|err).print используется, рассмотрите возможность использования логгера.
Мой вопрос - что такое Logger? Как это используется для печати на экран? Почему лучше?
6 ответов
Смотрите это краткое введение в log4j.
Вопрос в использовании System.out
распечатать отладочную или диагностическую информацию. Это плохая практика, потому что вы не можете легко изменить уровни журнала, выключить его, настроить его и т. Д.
Однако, если вы на законных основаниях используете System.out
чтобы распечатать информацию для пользователя, то вы можете игнорировать это предупреждение.
Если вы используете System.out|err.println(..) для распечатки информации о пользователе на консоли в методе main() вашего приложения, вы ничего не делаете неправильно. Вы можете избавиться от сообщения, вставив комментарий "//NOPMD".
System.out.println("Fair use of System.out.println(..).");// NOPMD
Для этой цели в опции PMD-Violations имеется вариант "Пометить как проверенный".
Конечно, вы можете обмануть PMD с помощью следующего фрагмента кода:
PrintStream out=System.out;
out.println("I am fooling PMD.");
Вне вашего main()- метода используйте Log-систему, например, 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 и т. Д. В любом методе с именем 'main' в вашем коде, но проверять наличие System.out.println в коде инициализатора. Мне это нравится, потому что, с моей точки зрения, System.out.println безопасен в методе main(String args[]). Но используйте с осторожностью, я должен проверить, где в AST может также возникнуть System.out.println и должен адаптировать XPath.
Эта ссылка предоставляет более краткую информацию о том, как использовать Log4j: не используйте System.out.println! Однако у этого есть только один маленький недостаток, вы не должны помещать библиотеку в /jre/lib/ext
, но только в пути к классам приложения и отправьте его вместе.
Преимущество состоит в том, что вы можете использовать уровни ведения журнала для указания важности информации, чтобы вы могли внешне настроить, какие уровни показывать / скрывать в выводе (чтобы вас не раздражала бесполезная информация) как должны выглядеть выходные данные (например, включать временную метку, идентификатор потока, имя класса, имя метода и т. д.) и куда должны быть записаны выходные данные (например, консоль, файл, электронное письмо и т. д.) и, например, в случае файлов также, как они должны быть созданы (например, группировать по году, месяцу и / или дню).
Есть несколько реализаций логгера, таких как встроенный в Java SE java.util.logging.Logger
удобное ведение журнала Apache Commons, популярный Apache Log4j, его преемник Logback и т. д. Вы можете использовать Slf4j в качестве дополнительного уровня абстракции для переключения между любыми из этих регистраторов, когда это необходимо.
Loggers имеет несколько уровней для ведения журнала.
Если мы пишем настоящую короткую программу, просто для учебных целей System.out.println
это хорошо, но когда мы разрабатываем качественный программный проект, мы должны использовать профессиональный регистратор, а СОП следует избегать.
Профессиональные регистраторы предоставляют различные уровни для регистрации и гибкости. Мы можем получить сообщение журнала соответственно. Например, сообщения группы X должны быть напечатаны только в PRODUCTION, сообщения группы Y должны быть напечатаны в ERROR и т. Д.
У нас есть ограниченная возможность для перенаправления сообщений в System.out
, но в случае логгера у вас есть appenders, который предоставляет количество опций. Мы даже можем создать пользовательский вариант вывода и перенаправить его на это.
Похоже, что PMD предполагает, что вы звоните System.out.println()
в целях отладки; такие вещи, как "Я в вашем методе, выполняю ваш код".
Если вы это сделаете, вам будет гораздо удобнее записывать в журнал, такой как Log4J, так как он будет иметь несколько параметров потоковой передачи, чем просто экран.
Если, однако, вы делаете консольное приложение и вызываете System.out
как часть этого, игнорируйте предупреждение.
System.out.println
не подходит для использования, так как не может быть настроен. Вместо этого Logger
можно настроить для входа на разных уровнях. У этого есть много других особенностей.