Since: PMD 2.0
Normally only one logger is used in each class.
This rule is defined by the following Java class: net.sourceforge.pmd.rules.MoreThanOneLogger
Example:
class Foo{ Logger log = Logger.getLogger(Foo.class.getName()); // It is very rare to see two loggers on a class, normally // log information is multiplexed by levels Logger log2= Logger.getLogger(Foo.class.getName()); }
Since: PMD 2.0
In most cases, the Logger can be declared static and final.
This rule is defined by the following XPath expression:
//VariableDeclarator [parent::FieldDeclaration] [../Type/ReferenceType /ClassOrInterfaceType[@Image='Logger'] and (..[@Final='false'] or ..[@Static = 'false'] ) ]
Example:
class Foo{ Logger log = Logger.getLogger(Foo.class.getName()); // It is much better to declare the logger as follows // static final Logger log = Logger.getLogger(Foo.class.getName()); }
Since: PMD 2.1
System.(out|err).print is used, consider using a logger.
This rule is defined by the following XPath expression:
//Name[ starts-with(@Image, 'System.out.print') or starts-with(@Image, 'System.err.print') ]
Example:
class Foo{ Logger log = Logger.getLogger(Foo.class.getName()); public void testA () { System.out.println("Entering test"); // Better use this log.fine("Entering test"); } }
Since: PMD 3.2
Avoid printStackTrace(); use a logger call instead.
This rule is defined by the following XPath expression:
//PrimaryExpression [PrimaryPrefix/Name[contains(@Image,'printStackTrace')]] [PrimarySuffix[not(boolean(Arguments/ArgumentList/Expression))]]
Example:
class Foo { void bar() { try { // do something } catch (Exception e) { e.printStackTrace(); } } }