Log4Net存储库作用域属性

时间:2017-07-25 05:17:50

标签: .net log4net

我正在以编程方式创建我的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”,但是在一台记录器上进行全局更改会在另一台记录器上更改它。

可以这样做吗?我是否错误地使用了存储库?

1 个答案:

答案 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。解释了不同的范围,我建议看一下堆栈。