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();
}
}
}