我正在制作车辆跟踪应用程序(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。
如果有人能指出我正确的方向,我将不胜感激。
答案 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命名。