2010-05-01 6 views
37

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

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

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

+0

Также см. Недавний вопрос: http://stackoverflow.com/questions/2746578/advantage-of-log4j – BalusC

ответ

26

См. this short introduction to log4j.

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

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

3

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

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

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

0

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

5

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

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

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

11

Если вы используете System.out | err.println (..), чтобы распечатать информацию о пользователе на консоли в главном() методе приложения, вы ничего не делаете неправильно. Вы можете избавиться от сообщения, вставив комментарий «// 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-Rule "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.

4

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

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

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

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