如何在Tomcat运行时更改日志级别?

3

我目前正在使用JULI日志框架,为我的WEB应用程序提供了一个特定的logging.properties文件,并放置在WEB-INF/classes文件夹中。

现在我想找到一种在运行时更改记录器日志级别的方法。

我发现有几个来源说可以通过MBean Server在运行时更改记录器的级别。不幸的是,适当的MBean "java.util.logging.Logging"没有列出我的Web应用程序特定的记录器,因此我无法执行"setLoggerLevel"方法。

有谁知道如何完成这个操作吗?感谢任何提示 - 除了那些建议使用log4j的提示...;-)

1个回答

2
连接 JConsole 到 Tomcat 并使用 MBean 标签来更改日志记录器级别是理想的方式。一个问题是,除非代码触发了日志记录器的创建,否则日志记录器名称不存在。您无法在代码运行之前使用 MBean 来创建日志记录器。您应该使用 JConsole 来确认 MBean 本身是否存在。
Tomcat 安装了一个 自定义 LogManager,它按当前类加载器进行过滤。JMX 将使用系统类加载器,因此 ClassLoaderLogManager 可能不会返回日志记录器名称,因为当前类加载器不是 Web 应用程序类加载器。
您可以创建一个servlet / jsp表单或与应用程序部署的webservice来获取记录器设置级别。 您可能需要在内存中固定每个修改后的记录器以保持记录器级别活动。 设置级别返回null后,可以释放记录器。 您将不得不处理包含此类页面的安全问题。
我不会在生产服务器上这样做,但是您可以在tomcat中配置WatchedResource,该资源指向logging.properties。 然后,每当该文件更新时,Web应用程序将使用新设置重新部署。 注意通过这种方式可能会导致ClassLoader泄漏

感谢您的建议。选项1:我使用Mission Control连接到Tomcat,并查看了bean“java.util.logging:type = Logging”。那里没有列出任何特定于Web应用程序的记录器。尽管选项2可能可行,但我总是通过Logger.getLogger(“...”)检索记录器实例,并且据我所知,在所有情况下都不能保证在此类实例上设置级别确实起作用 - 但我会尝试一下!选项3超出范围-我想避免重新部署 :-) - Torgeist
是的,你的编辑指向了我在选项2的评论中所说的内容:更改记录器实例并不一定解决问题。天哪 - 为什么那个MBean中没有列出任何特定于Web应用程序的记录器?毕竟这似乎是要解决的真正问题... - Torgeist
Tomcat的ClassLoaderLogManager可能存在一个bug,它正在过滤与系统类加载器相关的所有记录器,而不是Web应用程序类加载器。您应该编写一个JSP来迭代您的Web应用程序类加载器下的LogManager.getLoggerNames,并查看名称是否与JMX不同。 - jmehrens
是的,确实有区别:在 JSP 上使用 LogManager.getLoggerNames() 可以获取到我所期望的所有记录器,包括那些我想要更改的特定于 Web 应用程序的记录器!现在该怎么办呢?这是否意味着没有办法使用 MBean 浏览器更改日志级别?PS:抱歉回复晚了...非常感谢您的努力 :-) - Torgeist
您可以对Tomcat ClassLoaderLogManager提出RFE,以便在调用java.util.logging.LoggingMXBean时允许访问所有记录器。或者当CCL是系统类加载器时,允许访问所有记录器。 - jmehrens
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接