2017-05-21 54 views
0

我注射的log4net如下:注入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 %) 

老实说,我不知道为什么它甚至记录到控制台因为我不没有配置或启用该appender,并且即使在配置文件中注释掉XmlConfigurator.Configure()和log4net相关的东西时也会这样做。我唯一使用的appender是直布罗陀。请注意,我正在从VS运行此操作,而不是进行调试,并尝试了Debug和Release配置,结果相同。我添加了一个文件appender,并且行在结果日志文件中没有被复制

+0

你能设置一个断点来'返回LogManager.GetLogger()'只是为了证明你不会为每个请求产生单例?只是一个想法... – Waescher

+0

你为什么要注射Func而不是简单的ILog?我好奇。 – CodingYoshi

+0

@CodingYoshi所以每种类型都可以有自己的记录器。除非我误解你的问题......? –

回答

0

原来,另一家开发商已经这是不正确正在通过DI注入一类的构造函数中调用XmLConfigurator.Configure()。所以每次类实例化时,都会再次配置log4net,并添加每个配置的记录器的另一个实例。

0

你可能对你的伐木者没有配置加:

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

其实我想通了,并会发布我的答案。 –