log4net 多个记录器 - 属性

Posted

技术标签:

【中文标题】log4net 多个记录器 - 属性【英文标题】:log4net multiple loggers - properties 【发布时间】:2017-10-24 09:08:43 【问题描述】:

log4net v. 2.0.8

我在使用 log4net 进行多次日志记录时遇到了一些问题。我正在开发一个适用于 n 台设备的应用程序,我希望每个设备都有一个日志文件。

log4net.config

<log4net>

<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="%envFolderPathLocalApplicationData/Foo/Device%propertyDeviceID/log.txt"/>
  <appendToFile value="true"/>
  <maxSizeRollBackups value="10"/>
  <maximumFileSize value="10MB"/>
  <layout type="log4net.Layout.PatternLayout">
    <param name="Header" value="BEGIN LOGGING AT %date *** %property *** %newline" type="log4net.Util.PatternString" />
    <param name="Footer" value="END LOGGING AT %date *** %property *** %newline" type="log4net.Util.PatternString" />
    <param name="ConversionPattern" value="%date [%thread] %-5level %-5class1  %-5method(%line) %message %newline" />
  </layout>
  <filter type="log4net.Filter.PropertyFilter">
     <key value="Version" />
     <stringToMatch value="1" />
  </filter>
</appender>

<root>
  <level value="ALL" />
  <appender-ref ref="LogFileAppender" />
</root>

这是代码

  public DeviceClass(string deviceID)
    
        InitializeComponent();

        GlobalContext.Properties["DeviceID"] = deviceID;
        logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        logger.Debug("Hello world");

问题是,例如,如果我有两个设备,我只会得到第一个日志文件,其中包含来自所有设备的消息。

【问题讨论】:

【参考方案1】:

我不是 Log4Net 专家,但我相信日志管理器会在您第一次为给定类型/名称调用 GetLogger 时初始化记录器及其所有附加程序(隐藏的类型被转换为字符串名称)。在这种情况下,它不会为每台设备重新初始化一个。我对您的建议是尝试使用以下内容创建类型名称和设备 ID 的组合:

logger = LogManager.GetLogger($"System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullNamedeviceId");

【讨论】:

以上是关于log4net 多个记录器 - 属性的主要内容,如果未能解决你的问题,请参考以下文章

Log4Net 将两个不同级别的日志记录到同一记录器的两个不同附加程序

csharp log4net记录器扩展

C# 使用Log4Net记录程序日志

Log4Net之记录日志到数据库

c#中使用log4net工具记录日志

C#Log4net记录日志(转)