2013-02-28 65 views
0

我们目前正在使用Tomcat 7,使用-Djava.util.logging.config.file指定的单一日志配置,以及使用-Djava.util.logging.manager =“org.apache.juli.ClassLoaderLogManager”的默认ClassLoaderLogManager。这适用于一次性启动配置。在运行时重新加载tomcat日志记录?

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

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

现在的问题:我怎样才能重新加载这些设置从运行时的文件没有重新加载应用程序?

我已经试过什么:

  • LogManager.getLogManger.readConfiguration():结果在ClassLoaderLogManager有效NOOP因为Thread.currentThread.getContextClassLoader()是不是系统类加载器。
  • 显式设置Thread.setContextClassLoader(ClassLoader.getSystemClassLoader()),然后调用以上。这实际上是读取配置文件(在调试器中逐步完成的),但它并未将更改传播到包含的ClassLoaders中的现有记录器。 Logger.setLevel()从未在现有记录器上调用过。
  • 也调用reset()之前这些调用似乎并没有改变任何东西。
  • JMX似乎只暴露伐木者单个类加载器(可能是系统类加载器)
+0

您是否尝试过JMX? – 2013-02-28 17:03:36

+0

什么,具体与JMX? JConsole显示了java.util.logging上暴露的内容,但它似乎只是顶级ClassLoader的一部分。例如,没有记录来自servlet的类。 – TREE 2013-02-28 17:28:16

+0

JConsole ist correct,但是你可以看到[here](http://i.imgur.com/7mNwh5D.png) – 2013-02-28 17:40:24

回答

2

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

但是,这涉及到修改tomcat启动脚本。如果有人可以在没有这样做的情况下找到更好的解决方案,那会很好,否则我会接受这个答案。

0

如果你没有结婚到Tomcat JULI你可能要考虑使用的logback因为恕我直言其仅仅是能有效地处理日志在运行期间重新加载配置。

我自己没有这样做,但有人写了一个指南:Logging with SLF4J and Logback in Tomcat and TomEE它基本上使用一堆桥梁罐。

你可能会考虑的另一件事就是使用每个Web应用程序与Logback进行日志记录,并忽略Tomcat的JULI日志(即我所做的)。

CAVEAThttp://www.slf4j.org/legacy.html#jul-to-slf4j ...因此,请不要直接使用JUL .... Guava和Tomcat是我使用JUL的$ hit列表。

+0

Logback会更新java.util.logging Loggers的日志级别吗? – TREE 2013-02-28 18:34:15

+0

不,您会将JULI迁移到SLF4J,然后使用Logback作为后端。 – 2013-02-28 18:36:47

+0

是的,但我知道我认为logback在性能方面与java.util.logging有一些问题:http://www.slf4j.org/legacy.html#jul-to-slf4j ...基本上JULI是一个POS。 – 2013-02-28 18:40:42

相关问题