【问题标题】:Change logging level in Tomcat at runtime?在运行时更改Tomcat中的日志记录级别?
【发布时间】:2015-01-17 00:38:11
【问题描述】:

我在当前的 Tomcat 7 中使用 JULI 日志框架,在我的 WEB-INF/classes 文件夹中提供特定于 webapp 的 logging.properties

现在我正在寻找一种方法来更改记录器的日志级别在运行时

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

有谁知道如何做到这一点?感谢您提供任何提示 - 不包括那些建议使用 log4j 的提示,即... ;-)

【问题讨论】:

    标签: java tomcat logging


    【解决方案1】:

    JConsole 连接到Tomcat 并使用MBean 选项卡更改记录器级别是理想的方式。一个问题是记录器名称不存在,除非代码触发了记录器的创建。您不能使用 MBean 在代码运行之前创建记录器。您应该使用 JConsole 仔细检查 MBean 本身是否不存在。

    Tomcat 安装了一个custom LogManager,它通过当前的类加载器进行过滤。 JMX 将使用系统类加载器,因此 ClassLoaderLogManager won't return the logger names 可能是因为当前的类加载器不是 Web 应用类加载器。

    您始终可以创建一个 servlet/jsp 表单或 Web 服务,将应用程序部署到 get the loggerset the level。您可能必须 pin 内存中每个已修改的记录器以保持记录器级别处于活动状态。将级别设置回 null 后,您可以释放记录器。您必须处理包含此类页面的安全问题。

    我不会在生产服务器上执行此操作,但您可以在 tomcat 中配置一个指向您的 logging.properties 的WatchedResource。然后,每当更新该文件时,都会使用新设置重新部署 Web 应用程序。当心ClassLoader leaks 走这条路。

    【讨论】:

    • 感谢您的建议。选项 1:我连接到 Tomcat(使用 Mission Control)并查看了 bean“java.util.logging:type=Logging”。那里没有列出特定于 webapp 的记录器。选项 2 可能是可能的,尽管我总是通过 Logger.getLogger("...") 检索记录器实例,并且 afaik 不能保证在所有情况下设置此类实例的级别确实有效 - 但我会给出试试看!选项 3 超出范围 - 这是我想避免的重新部署 :-)
    • 是的,您的编辑指向我在选项 2 的评论中的意思:更改记录器实例不一定能解决问题。天哪 - 为什么该 MBean 中没有列出特定于 Web 应用程序的记录器?!毕竟这似乎是真正需要解决的问题......
    • Tomcat ClassLoaderLogManager 中可能存在一个错误,它正在过滤与系统类加载器相关的所有记录器,而不是 Web 应用程序类加载器。您应该编写一个 jsp 来遍历您的 web-app 类加载器下的 LogManager.getLoggerNames 并查看名称是否与 JMX 不同
    • 是的,有一点不同:JSP 上的 LogManager.getLoggerNames() 提供了我期望的所有记录器——包括那些我想要更改的特定于 web 应用程序的记录器!现在该怎么办?这是否意味着根本无法使用 MBean 浏览器更改日志级别? PS:抱歉耽搁了......我非常感谢你的努力:-)
    • 您可以针对 Tomcat ClassLoaderLogManager 提交 RFE,以允许在调用站点来自 java.util.logging.LoggingMXBean 时访问所有记录器。或者当 CCL 是系统类加载器时允许访问所有记录器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2023-04-11
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2019-04-09
    • 2016-02-20
    相关资源
    最近更新 更多