在运行时重新加载tomcat日志记录?

在运行时重新加载tomcat日志记录?,tomcat,tomcat7,java.util.logging,Tomcat,Tomcat7,Java.util.logging,我们目前正在使用Tomcat 7,使用-Djava.util.logging.config.file指定单日志配置,并使用-Djava.util.logging.manager=“org.apache.juli.ClassLoaderLogManager”指定默认的ClassLoaderLogManager。这对于一次性启动配置非常有用 我们有几个servlet和其他在servlet上下文之外运行的代码。我们运行在我们完全控制的专用tomcat服务器上,我们希望所有代码都使用相同的日志配置。我们

我们目前正在使用Tomcat 7,使用-Djava.util.logging.config.file指定单日志配置,并使用-Djava.util.logging.manager=“org.apache.juli.ClassLoaderLogManager”指定默认的ClassLoaderLogManager。这对于一次性启动配置非常有用

我们有几个servlet和其他在servlet上下文之外运行的代码。我们运行在我们完全控制的专用tomcat服务器上,我们希望所有代码都使用相同的日志配置。我们正在使用java.util.logging API进行日志记录。这意味着LogManager.getLogManager().getLogger(名称)需要工作,Logger.isLoggable(级别)需要工作

ClassLoaderLogManager似乎与我们的情况相反:允许servlet指定单独的日志设置。我们希望所有的日志都控制在一个地方。但是,我们确实想要其他JULI的好处,比如改进的FileHandler

现在的问题是:如何在运行时从文件中重新加载这些设置而不重新加载应用程序

我所尝试的:

  • LogManager.getLogManger.readConfiguration():导致ClassLoaderLogManager中出现有效的NOOP,因为Thread.currentThread.getContextClassLoader()不是系统类加载器
  • 显式设置Thread.setContextClassLoader(ClassLoader.getSystemClassLoader()),然后调用上述函数。这确实读取了配置文件(在调试器中逐步执行),但没有将更改传播到包含的类加载器中的现有记录器。从未对现有记录器调用Logger.setLevel()
  • 在这些调用之前调用reset()似乎不会改变任何事情
  • JMX似乎只公开单个类加载器(可能是系统类加载器)的记录器

如果您没有与Tomcat Juli结婚,您可能需要考虑使用IMRO的回退,它是唯一可靠的处理运行时日志配置重载的工具。 我自己并没有这样做,但有人写了一个指南:基本上使用了一堆桥罐

另一件事,你可能会考虑只使用带有日志回滚的Web应用程序日志,而忽略Tomcat的Juli日志(这就是我所做的)。


警告:。。。因此,请不要直接使用JUL。。。。和Tomcat都在我的$hit列表中,因为我使用了JUL。

我找到了一个解决方案。使用默认的java.util.logging.LogManager替换启动脚本中的日志管理器,或者简单地删除命令行参数,都会导致使用常规日志管理器。调用readConfiguration()时,此日志管理器将完全重新加载所有类加载器中所有记录器的配置,这正是我需要的行为


但是,这确实涉及到修改tomcat启动脚本。如果有人不这样做就能找到更好的解决方案,那就太好了,否则我会接受这个答案

什么,特别是JMX?JConsole显示了java.util.logging上公开的内容,但它似乎只是顶级类加载器的一部分。例如,Servlet中的类没有日志记录程序是公开的。JConsole是正确的,但是您可以,看看是否在属性下看到“LoggerNames”,这就是我所指的。它不包括servlet中的记录器。这意味着我无法为在servlet中创建的任何记录器设置日志级别。为什么不使用setLogLevel?这应该可以。从哪里来?我需要为每个类加载器中的每个记录器调用它。我并不特别想重写配置文件解析代码。logback会更新java.util.logging记录器的日志级别吗?不,你会将JULI brigde到SLF4J,然后使用logback作为后端。是的,但我知道,我认为logback在性能方面与java.util.logging存在某种问题:。。。基本上JULI是一个POS.JULI!=java.util.logging。JULI来自apache,是Tomcat的一部分(尽管文档将其描述为一个独立的项目)。是的,我把缩写词弄糊涂了。雄猫没有番石榴那么有罪。