Log4Net写入不同的文件

时间:2014-07-22 11:37:25

标签: log4net log4net-configuration log4net-appender

我正在制作车辆跟踪应用程序(ASP.NET MVC C#)。我有Windows服务,它接收GPS设备发送的数据。在服务中,我编写了用于记录数据的代码。

现在考虑一个正常的日志记录场景,其中我只有一个GPS设备。

  

08:00:24 OnDataAvailable Method

     

08:00:25收到数据 - 设备ID:2数据:abcdefghijkl

     

08:00:25离开OnDataAvailable

还有更多的陈述。然后重复


现在,当我有多个GPS设备发送数据时,日志会混合。那是我有以下类型的日志:

  

08:00:23 OnDataAvailable方法内部08:00:24 OnDataAvailable内部   方法

     

08:00:25收到数据 - 设备ID:2数据:abcdefghijkl

     

08:00:25离开OnDataAvailable

     

08:00:26收到数据 - 设备ID:1数据:abcdefghijkl

     

08:00:26离开OnDataAvailable

现在我想要实现的是,我应该为不同的设备提供不同的日志文件。因此,对于具有Id 1的设备,我有Log_D1.txt,对于设备ID 2,Log_D2.txt。

如果有人能指出我正确的方向,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

您应该能够使用其中一个上下文对象(如ThreadContext.Properties)来构建文件名。您可以配置日志文件名以使用属性来构建名称。因此,在您的情况下,您可以将设备ID存储在上下文中(您的请求是在单独的线程中处理吗?)。

本文对其工作原理有一个很好的解释:

http://geekswithblogs.net/rgupta/archive/2009/03/03/dynamic-log-filenames-with-log4net.aspx

总而言之,您可以将appender配置为:

<appender name="RollingFileAppenderV1" type="log4net.Appender.RollingFileAppender">
     <file type="log4net.Util.PatternString" value="F:\HornetFeed\Log_%property{DeviceID}" />
     <appendToFile value="true" />
     <rollingStyle value="Size" />
     <maxSizeRollBackups value="-1" />
     <maximumFileSize value="5000KB" />
     <staticLogFileName value="true" />
     <countDirection value="1"/>
     <layout type="log4net.Layout.PatternLayout">
         <conversionPattern value="%m%n" />
     </layout>
     <filter type="log4net.Filter.PropertyFilter">
         <Key value="Version" />
         <StringToMatch value="1" />
     </filter>
     <filter type="log4net.Filter.DenyAllFilter" />
</appender>

请注意在文件名规范中使用%property

然后,在您的代码中,您可能会执行以下操作:

private void OnDataAvailable(string id, int data)
{
  ThreadContext.Properties["DeviceID"] = id;

  logger.Info("Inside OnDataAvailable");

  logger.Info("Leaving OnDataAvailable");
}

至少在设置了DeviceID属性的情况下,所有日志消息都应该分隔成单独的文件,这些文件部分由DeviceID命名。