Why do we declare Loggers static final?
In Java, why is it best practice to declare a logger static final
?
private static final Logger S_LOGGER
Solution 1:
-
private
- so that no other class can hijack your logger -
static
- so there is only one logger instance per class, also avoiding attempts to serialize loggers -
final
- no need to change the logger over the lifetime of the class
Also, I prefer name log
to be as simple as possible, yet descriptive.
EDIT: However there is an interesting exception to these rules:
protected final Logger log = LoggerFactory.getLogger(getClass());
as opposed to:
private static final Logger log = LoggerFactory.getLogger(Foo.class);
The former way allows you to use the same logger name (name of the actual class) in all classes throughout the inheritance hierarchy. So if Bar
extends Foo
, both will log to Bar
logger. Some find it more intuitive.
Solution 2:
Check this blog post: Get Rid of Java Static Loggers. This is how you use slf4j with jcabi-log:
import com.jcabi.log.Logger;
class Foo {
void save(File f) {
Logger.info(this, "file %s saved successfully", f);
}
}
And never use that static noise any more.