注入的 log4net 将重复消息记录到控制台

Injected log4net logs duplicate message to console

我正在注入 log4net 如下:

DI

container.RegisterSingleton<Func<object, ILog>>(instance => {
    return LogManager.GetLogger(instance.GetType());
});

用法

public class MyClass {
    private readonly ILog _logger;

    public MyClass(Func<object, ILog> loggerFactory) {
        _logger = loggerFactory(this);
    }
}

在控制台中,我收到了可预测的重复消息。第一组消息打印一次,第二组打印两次,第六组打印六次,等等...

4470 [6] INFO JobManager - Getting pending jobs...
5953 [5] DEBUG JobManager - #113: 1 / 14 (7.14 %)
6489 [6] INFO JobManager - Getting pending jobs...
6489 [6] INFO JobManager - Getting pending jobs...
7679 [8] DEBUG JobManager - #113: 2 / 14 (14.29 %)
7679 [8] DEBUG JobManager - #113: 2 / 14 (14.29 %)
8512 [6] INFO JobManager - Getting pending jobs...
8512 [6] INFO JobManager - Getting pending jobs...
8512 [6] INFO JobManager - Getting pending jobs...
9551 [29] DEBUG JobManager - #113: 3 / 14 (21.43 %)
9551 [29] DEBUG JobManager - #113: 3 / 14 (21.43 %)
9551 [29] DEBUG JobManager - #113: 3 / 14 (21.43 %)

老实说,我不确定为什么它甚至会记录到控制台,因为我没有配置或启用该附加程序,即使我发表评论它也会这样做out XmlConfigurator.Configure() 和配置文件中的log4net相关的东西。我使用的唯一 appender 是 Gibraltar。请注意,我是来自 VS 的 运行,而不是调试,并且尝试了 Debug 和 Release 配置,结果相同。我添加了一个文件附加程序,结果日志文件中的行没有重复

您的记录器上可能没有配置可加性:

<logger name="myloggername" additivity="false">

事实证明,另一位开发人员一直在 class 的构造函数中调用 XmLConfigurator.Configure(),但未通过 DI 正确注入。所以每次实例化 class 时,都会再次配置 log4net,为每个配置的记录器添加另一个实例。