On 3/18/2017 20:04, Adam Gent wrote:

[snip]

I also wonder if your general opinion isn't stockholm syndrom. Do you
have any idea how many people hate:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for
further details.

That's just a warning message. SLF4J could drop that warning. The user would be oblivious to why logging is not working but otherwise things would just be ticking.

As a library writer it is fairly annoying to have to deal with users
complaining about. The ones that really care about logging are
generally OK with dealing with extra step

Logging needs to be set up somehow. SLF4J has adopted the most stupid approach imaginable for selecting the logging backend. The main advantage of this stupid approach is that it is easy to understand to anyone interested.

In that case, my recommendation is: Just use SLF4J as it comes out of the
box. (I have yet to see a different recommendation.)

Particularly if this library is high performance or maybe used by
android applications. In such case the library would default to the
NOPLogger and thus not initialize.

There is a little android related optimization in org.slf4j.LoggerFactory during initialization which was introduced a few months back.


How would the library know whether it's called in Android?
Should it even care?


Yes. The reality is often it has to. Maybe not the code itself but the
library maintainers might have to be concerned with Android (this
includes backporting at times).
Of course if you don't care about Android...


Your proposal does not change anything about the performance of trace
messages.

Yes it does! I have benchmarked it myself... but alas I don't feel
like pulling JMH out now nor the hassle of dealing with Android to
prove such. Unless you are extremely careful about configuration or
just always globally using the NOPLogger there is generally some
overhead the logging framework will do per call. Now I admit this is a
while ago and I can't remember what logging framework was underneath.
Maybe logback does a better job. I can't imagine it some how has
specially loggers for each level (or maybe it does).

I somehow doubt that. NOPLogger does nothing, so invoking it costs a method call. Getting a NOPLogger involves reading the value of INITIALIZATION_STATE which is a volatile int. Unless reading volatile variables is expensive in Android, there is really no way to optimize logging with SLF4J+NOPLogger.

That's a solved problem: SLF4J is collecting log messages during startup,
and emitting them once the backend is ready.

That doesn't fix anything. I have to now figure out how to intercept
the backend before it does whatever you know like connecting to a
message queue.

Why do you think you need your own interception? In multi-threaded boot-up process, SLF4J event replay just works. It's an internal process transparent to user code. In a single threaded boot-up, event replay works just as well. The interception is done by SLF4J while the logging back end is configuring itself and the intercepted events are replayed after the logging backed has finished configuring itself.

--
Ceki
_______________________________________________
slf4j-user mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/slf4j-user

Reply via email to