0

原标题:如何让 Apache LogFactory 始终返回相同的日志实现?

我有一个项目,它使用了很多不同的记录器来配置去不同的地方。当我运行单元测试时,我想用我自己实例化的 SimpleLogger 覆盖它们。如何将其设置为 LogFactory 以便始终返回以进行单元测试?

我真的不想处理外部配置文件。

作为一点背景知识,我发现记录器是出了名的不可信。确切地说,它并不是真正的记录器,而是有很多方法可以配置它和过滤输出——它可以从各种配置文件或代码中的任何地方完成,然后它可以输出到各种位置。记录器甚至可以根据配置将某种输出(错误)发送到与其他位置不同的位置。

尽管这可能非常棒且功能强大,但是当您花费 6 个小时想知道为什么您的代码在实际被调用时没有被调用但您的输出被重定向时,这一切都被取消了。

在运行测试时,我希望尽可能确保看到所有输出,因此我想将所有日志重定向到控制台。(所有,就像在我当前的项目中一样,可以创建分布在 6 个目录中的几十个不同的日志文件。)

4

1 回答 1

1

我终于想出了一个方法来做到这一点。

您可以使用自己的工厂扩展 LogFactory——覆盖这两个 getInstance 方法以返回您的记录器(显然所有其他方法都可以为空)。我使用 SimpleLogger 将所有日志记录到控制台:

公共日志 getInstance(String name) 抛出 LogConfigurationException {
    // 如果这不仅仅是为了测试,我会保留这些记录器的地图...
    SimpleLog consoleLogger=new SimpleLog(name);
    consoleLogger.setLevel(SimpleLog.LOG_LEVEL_ALL);
    返回控制台记录器;
}
公共日志 getInstance(Class className) 抛出 LogConfigurationException {
    返回 getInstance(arg0.getName());
}

然后在此类中使用静态方法安装它:

公共静态无效初始化(){
    System.setProperty(LogFactory.FACTORY_PROPERTY, MyLogFactory.class.getName());
}

这将整个日志重新路由限制为一个类,如果您在测试开始时调用 initialize(),则会话的所有日志输出都将重新路由到控制台。不要稍后调用它,否则您正在测试的代码可能已经调用了“正常”工厂并缓存了真正的记录器。

于 2012-12-07T17:04:54.617 回答