我正在以编程方式创建我的log4net记录器,方法是加载一个xml文件,然后设置全局属性,比如...
<log4net>
<root>
<!-- level is set programatically <level value="DEBUG" /> -->
<appender-ref ref="Log4NetDefaultAppender" />
</root>
<appender name="Log4NetDefaultAppender" type="log4net.Appender.RollingFileAppender" >
<param name="File" value="%property{workingDirectory}\..\\Logs\\%property{processName}.log" type="log4net.Util.PatternString"/>
和...
log4net.GlobalContext.Properties["workingDirectory"] = Directory.GetCurrentDirectory();
log4net.GlobalContext.Properties["processName"] = processName;
log4net.GlobalContext.Properties["sessionid"] = Guid.NewGuid().ToString();
XmlConfigurator.Configure("myconfig.xml");
我这样做是因为我有大约100个进程需要记录到单个文件 - 我不想维护100个配置文件。动态创建配置很好,但是......
在某些情况下,我需要登录辅助日志文件。我想使用相同的代码和配置,但打开一个单独的日志文件。
由于log4net的全局特性,我遇到了问题。只需创建一个新实例即可关闭第一个日志文件,然后继续在辅助文件中写入。我假设这是因为XmlConfigurator.Configure()是全局的。
我尝试过创建一个单独的存储库......
ILoggerRepository logRepository = LogManager.CreateRepository(processName);
但是仍然存在属性为全局的问题(我也在输出中使用这些属性)。
我尝试在存储库中设置属性,但只使用全局属性。
logRepository.Properties["sessionid"] = Guid.NewGuid().ToString();
我也使用%property {sessionid}在日志输出中打印“sessionid”,但是在一台记录器上进行全局更改会在另一台记录器上更改它。
可以这样做吗?我是否错误地使用了存储库?
答案 0 :(得分:0)
只有一些关于记录到一个文件的100个文件的反馈效率不高。如果您有大量日志消息,则日志记录可能会对您的解决方案的性能产生巨大影响。每次进程记录进程时都会尝试获取锁定并在记录后释放锁定。考虑另一个性能提升器。
登录到辅助文件时,我会在您的配置中创建第二个appender,然后指定使用该配置的记录器。
<logger name="SecondFile">
<level value="INFO" />
</logger>
var logger = LogManager.GetLogger("SecondFile");
logger.Info("This logs to your second file");
在此页面上,您可以找到如何使用log4net different contexts。解释了不同的范围,我建议看一下堆栈。