1

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

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

08:00:24 OnDataAvailable 方法内部

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。

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

4

1 回答 1

2

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

这篇文章很好地解释了它是如何工作的:

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

总而言之,您可以像这样配置您的附加程序:

<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 命名。

于 2014-07-22T15:52:43.663 回答