【发布时间】:2016-01-28 21:00:03
【问题描述】:
我正在编写一个自定义日志配置类,它设置一个特定的处理程序并将其与根记录器相关联,并计划在多个应用程序中使用它。我担心实际的程序代码会删除该处理程序并安装一个不同的处理程序。
有没有办法让处理程序检测到它已从特定记录器中删除,或者记录器报告关联已更改?
我唯一的另一种选择是有一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看
【问题讨论】:
我正在编写一个自定义日志配置类,它设置一个特定的处理程序并将其与根记录器相关联,并计划在多个应用程序中使用它。我担心实际的程序代码会删除该处理程序并安装一个不同的处理程序。
有没有办法让处理程序检测到它已从特定记录器中删除,或者记录器报告关联已更改?
我唯一的另一种选择是有一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看
【问题讨论】:
有没有办法让处理程序检测到它已从特定记录器中删除,或者记录器报告关联已更改?
为了生成 Logger 的子类,您必须创建一个自定义 LogManager。在某些环境中需要一个特定的日志管理器,因此这可能不起作用。
但是,您可以尝试一些 hacky 的东西。
修改记录器处理程序需要记录权限。在 SecurityManager 下运行,它要么阻止其他线程访问,要么创建一个自定义 SecurityManager,在请求日志控制时触发一些回调。
如果您能够克服这种高度实现特定且脆弱,您可以使用 Logger.removeHandler 依赖于调用 Handler.equals(Object) 的事实。在您的自定义处理程序实现中覆盖 equals 并使用 Throwable.getStackTrace() 检查帧以检查是否从 removeHandler 调用了 equals。如果是则简单地返回 false。
我唯一的另一种选择是有一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看
为极度丑陋做好准备。
【讨论】:
您可以创建一个自定义 Logger 来覆盖 removeHandler() 以执行您需要的任何特殊处理,并记录到该记录而不是根记录器。
【讨论】: