The bottom line is the initialization is not thread-safe and IMO there is no reason for it not to be. Log messages WILL be lost at some point. A no-op logger is just a bad idea in general. FWIW the fix in fixSubstitutedLoggers() method isn't really thread-safe either. The following returns a newly created list of SubstituteLoggers. List<SubstitutableLogger> loggers = TEMP_FACTORY.getLoggers(); At the end TEMP_FACTORY.clear(); is invoked which could potentially result in a loss of a logger that was created in SubstituteLoggerFactory while the loop is creating the loggers on the current LoggerFactory. I will say that fix is better than nothing though. Just ignoring the issue isn't going to solve it :)