[slf4j-user] Fail Silently on NOP implementation

Joachim Durchholz jo at durchholz.org
Fri Apr 29 14:02:17 UTC 2016


Am 29.04.2016 um 12:26 schrieb Ceki Gulcu:
> SLF4J's approach of binding with an implementation by directly
> invoking the org.slf4j.impl.StaticLoggerBinder.getSingleton() method
> from within LoggerFactory is primitive and very unsophisticated. Other
> approaches to this problem, e.g. OSGi, address many of the
> shortcomings of the direct invocation approach. However, OSGi is very
> hard to master and only a small minority of developers understand
> it. In contrast, the SLF4J approach can be understood by most
> programmers on their first day of programming in Java.

Point.

> SLF4J's static binding approach is a direct reaction to the dynamic
> binding approach (via classloader inspection) as adopted by Jakarta
> Common Logging. The classloader approach is more convenient in many
> cases but may become extremely complicated to debug when things go
> wrong, see [1].

Point, but it's worse: If classpath inspection fails, you need to log 
that somewhere. But the logger doesn't work. Catch-22.

Considering the options, I think SLF4J is right on spot with that.
Also, making the loggers dynamically configurable or anything just 
complicates things, adds more failure modes that might need to be logged.
I really think that Phillip hasn't seen the use cases for which SLF4J 
was built, and hence has no idea why libraries and applications are such 
different beasts and how there might be needs that diverge from his.

> Jigsaw (new in Java 9) purportedly provides a solution to the jar hell
> problem.

Well, it's the question whether you want to allow another configuration 
mechanism than jar inclusion in the classpath.

 > I wonder how SLF4J could be modified to cater for Jigsaw
> modules.

It might be a good idea to separate the static-binding aspects out into 
separate libraries. I.e. slf4j-simple.jar retains just the 
StaticLoggerBinder, and there's a Maven dependency on the new 
slf4j-simple-implementation.jar that has all the rest.

That way, you could write a DynamicLoggerBinder that can switch between 
loggers.

Maybe my imagination is too limited, but the only use case I can come up 
with for this kind of stuff is testing. It would be nice to test all 
backends without having to fire up a separate JVM or classloader for 
each test.
In general, I don't want the logging layer to be dynamically replacable. 
There be dragons there - logging is for code that needs to be monitored, 
and it needs to be primitive so it can be failsafe.

Just my 3c.
Jo


More information about the slf4j-user mailing list