The Java Logging ruleset contains a collection of rules that find questionable usages of the logger.
Normally only one logger is used in each class.
This rule is defined by the following Java class: net.sourceforge.pmd.rules.MoreThanOneLogger
Here's an example of code that would trigger this rule:
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());
}
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'] ) ]
Here's an example of code that would trigger this rule:
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());
}
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')
]
Here's an example of code that would trigger this rule:
class Foo{
Logger log = Logger.getLogger(Foo.class.getName());
public void testA () {
System.out.println("Entering test");
// Better use this
log.fine("Entering test");
}
}
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))]]
Here's an example of code that would trigger this rule:
class Foo {
void bar() {
try {
// do something
} catch (Exception e) {
e.printStackTrace();
}
}
}