我正在编写一个自定义日志配置类,它设置一个特定的处理程序并将其与根记录器关联,并计划在多个应用程序中使用它。我担心实际的程序代码将删除该处理程序并安装另一个。
是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者记录器是否报告了该员工已更改?
我唯一的另一种选择是让一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看
答案 0 :(得分:2)
是否有一种方法可以让处理程序检测到它已从特定记录器中删除,或者记录器是否报告了该员工已更改?
为了生成Logger的子类,您必须创建一个自定义LogManager。在某些环境中,期望特定的日志管理器可能无法正常工作。
然而,你可以尝试一些hacky事情。
修改记录器处理程序需要记录权限。在SecurityManager下运行,以防止其他线程访问或创建自定义SecurityManager,在请求记录控制时触发某些回调。
如果您可以通过高度针对特定且脆弱的,则可以使用Logger.removeHandler依赖于调用Handler.equals(Object)这一事实。在自定义处理程序实现中覆盖equals并使用Throwable.getStackTrace()检查帧以检查是否从removeHandler调用了equals。如果它只是返回false。
我唯一的另一种选择是让一个线程定期轮询根记录器处理程序并重新连接这个处理程序,这非常难看
为极其丑陋做好准备。
答案 1 :(得分:0)
您可以创建一个自定义Logger
来覆盖removeHandler()以执行您需要的任何特殊处理,并记录到该记录而不是根记录器。