【问题标题】:Is it possible to make a Handler recognize that it had been removed?是否可以让 Handler 认识到它已被删除?
【发布时间】:2016-01-28 21:00:03
【问题描述】:

我正在编写一个自定义日志配置类,它设置一个特定的处理程序并将其与根记录器相关联,并计划在多个应用程序中使用它。我担心实际的程序代码会删除该处理程序并安装一个不同的处理程序。

有没有办法让处理程序检测到它已从特定记录器中删除,或者记录器报告关联已更改?

我唯一的另一种选择是有一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看

【问题讨论】:

    标签: java java.util.logging


    【解决方案1】:

    有没有办法让处理程序检测到它已从特定记录器中删除,或者记录器报告关联已更改?

    为了生成 Logger 的子类,您必须创建一个自定义 LogManager。在某些环境中需要一个特定的日志管理器,因此这可能不起作用。

    但是,您可以尝试一些 hacky 的东西。

    1. 修改记录器处理程序需要记录权限。在 SecurityManager 下运行,它要么阻止其他线程访问,要么创建一个自定义 SecurityManager,在请求日志控制时触发一些回调。

    2. 如果您能够克服这种高度实现特定且脆弱,您可以使用 Logger.removeHandler 依赖于调用 Handler.equals(Object) 的事实。在您的自定义处理程序实现中覆盖 equals 并使用 Throwable.getStackTrace() 检查帧以检查是否从 removeHandler 调用了 equals。如果是则简单地返回 false。

    我唯一的另一种选择是有一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看

    为极度丑陋做好准备。

    【讨论】:

    • 这个答案让我不寒而栗。
    • @IngoBürk 添加了警告以显示出色的黑客行为。要记住的是,对于 OPs 问题没有干净的解决方案。将此答案视为显示如何在 java.util.logging 中制作香肠。
    • 积极的一面是,这些建议让我非常害怕,以至于我的方法看起来很合理:)
    • @Uri 完全同意。足以让你成为 java.util.logging vegan。
    【解决方案2】:

    您可以创建一个自定义 Logger 来覆盖 removeHandler() 以执行您需要的任何特殊处理,并记录到该记录而不是根记录器。

    【讨论】:

    • 不幸的是,我无法控制记录器 - 只能控制可以创建的处理程序和记录配置文件:(
    猜你喜欢
    • 2022-10-23
    • 2020-04-14
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多