我们目前正在使用 Tomcat 7,其中使用 -Djava.util.logging.config.file 指定单个日志配置,默认 ClassLoaderLogManager 使用 -Djava.util.logging.manager="org.apache.juli.ClassLoaderLogManager"。这对于一次性启动配置非常有用。
我们有几个 servlet 和其他在 servlet 上下文之外运行的代码。我们在我们完全控制的专用 tomcat 服务器上运行,并且我们希望所有代码使用相同的日志配置。我们使用 java.util.logging API 进行日志记录。这意味着 LogManager.getLogManager().getLogger(name) 需要工作,而 Logger.isLoggable(Level) 需要工作。
ClassLoaderLogManager 似乎与我们的情况相反:允许 servlet 指定单独的日志设置。我们希望将所有日志控制在一个地方。但是,我们确实想要其他 JULI 的好处,比如改进的 FileHandlers。
现在的问题是:如何在运行时从文件中重新加载这些设置而不重新加载应用程序?
我试过的:
- LogManager.getLogManger.readConfiguration():在 ClassLoaderLogManager 中产生有效的 NOOP,因为 Thread.currentThread.getContextClassLoader() 不是系统类加载器。
- 显式设置 Thread.setContextClassLoader(ClassLoader.getSystemClassLoader()) 然后调用上面的。这确实读取了配置文件(在调试器中逐步执行),但它没有将更改传播到包含的 ClassLoaders 中的现有记录器。Logger.setLevel() 从未在现有记录器上调用。
- 在这些调用之前调用 reset() 似乎没有任何改变。
- JMX 似乎只公开单个 ClassLoader(可能是系统 ClassLoader)的记录器