Java 是否可以让处理程序识别它已被删除?

Java 是否可以让处理程序识别它已被删除?,java,java.util.logging,Java,Java.util.logging,我正在编写一个自定义日志配置类,该类设置一个特定的处理程序并将其与根记录器关联,并计划在多个应用程序中使用它。我担心实际的程序代码将删除该处理程序并安装另一个处理程序 是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者让记录器报告关联已更改 我唯一的另一种选择是使用一个线程,该线程将定期轮询根记录器处理程序并重新连接此处理程序,这非常难看您可以创建一个自定义的记录器,该记录器将覆盖您需要的任何特殊处理,并记录到该线程而不是根记录器 是否有一种方法可以让处理程序检测到它已从特定记录器中

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

是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者让记录器报告关联已更改


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

您可以创建一个自定义的
记录器
,该记录器将覆盖您需要的任何特殊处理,并记录到该线程而不是根记录器

是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者让记录器报告关联已更改

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

然而,有一些骇客的事情,你可以尝试

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

  • 如果您能够克服这一点,即高度特定于实现且脆弱,那么就可以使用Logger.removeHandler依赖于调用的事实。在自定义处理程序实现中重写equals,并使用检查帧以检查是否从removeHandler调用了equals。如果是,则返回false

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


    准备好面对极其丑陋的局面。

    这个回答让我不寒而栗。@IngoBürk添加了警告,以显示出黑客们的高超技艺。要记住的是,老年退休金问题没有干净的解决办法。把这个答案想象成是在java.util.logging中如何制作香肠的。从积极的方面来说,这些建议让我非常害怕,以至于我的方法似乎是合理的:)@Uri完全同意。这足以让您成为java.util.logging素食主义者。不幸的是,我无法控制记录器-只能控制可以创建的处理程序和日志配置文件:(