原标题:如何让Apache LogFactory始终返回相同的日志实现?
我有一个项目,使用了相当多的不同的记录器配置到不同的地方。当我运行单元测试时,我想用一个我自己实例化的SimpleLogger来覆盖它们。我如何将其设置到LogFactory中,以便它始终返回用于单元测试?
我真的不想处理外部配置文件。
作为一个小背景,我发现伐木工人不值得信任。它并不是真正的记录器,而是有很多方法可以配置它并过滤输出——它可以从各种配置文件或代码中的任何地方进行,然后可以发送到各种位置。记录器甚至可以根据配置将某种输出(错误)发送到不同的位置。
尽管这可能非常棒和强大,但当你花了6个小时想知道为什么你的代码没有被调用,而实际上它正在被调用,但你的输出正在被重定向时,这一切都结束了。
当运行测试时,我想尽可能确保我看到了所有的输出,所以我想将所有日志重定向到控制台。(所有这些,就像我目前的项目一样,可以创建分布在6个目录中的几十个不同的日志文件。)
我终于找到了一种方法。
您可以用自己的工厂扩展LogFactory——覆盖两个getInstance方法以返回记录器(显然所有其他方法都可以为空)。我使用SimpleLogger将所有日志分配到控制台:
public Log getInstance(字符串名称)抛出LogConfigurationException{//如果这不仅仅是为了测试,我会保留一张这些记录器的地图。。。SimpleLog consoleLogger=新的SimpleLog(名称);consoleLogger.setLevel(SimpleLog.LOG_LEVEL_ALL);返回控制台日志;}公共日志getInstance(类类名)引发LogConfigurationException{return getInstance(arg0.getName());}
然后在这个类中用一个静态方法安装它:
public static void initialize(){System.setProperty(LogFactory.FACTORY_PROPERTY,MyLogFactory.class.getName());}
这将整个日志重新路由限制在一个类中,如果在测试开始时调用initialize(),则会话的所有日志输出都将重新路由到控制台。以后不要调用它,否则您正在测试的代码可能已经调用了"Normal"工厂并缓存了真正的记录器。