Whatever is the logging framework (logback, log4j, commons-logging, java.util.logging, ...), a logger should be:
private
: Never be accessible outside of its parent class. If another class needs to log something, it should instantiate its own logger.static
: Not dependent on an instance of a class (an object). When logging something, contextual information can of course be provided in the messages but the logger should be created at class level to prevent creating a logger along with each object.final
: Be created once and only once per class.public class Foo { public Logger logger = LoggerFactory.getLogger(Foo.class); // Noncompliant public void doSomething() { /* ... */ } } public class Bar { public static void main(String[] args) { Foo foo = new Foo(); foo.logger.info("Program started"); foo.doSomething(); } }
public class Foo { private static Logger LOGGER = LoggerFactory.getLogger(Foo.class); // Compliant public void doSomething() { /* ... */ } } public class Bar { private static Log LOGGER = LogFactory.getLogger(Bar.class); // Compliant public static void main(String[] args) { LOGGER.info("Program started"); Foo foo = new Foo(); foo.run(); } }