Log4Net写入不同的文件

Log4Net写入不同的文件,log4net,log4net-configuration,log4net-appender,Log4net,Log4net Configuration,Log4net Appender,我正在制作一个车辆跟踪应用程序(ASP.NET MVC)。我有windows服务,它接收GPS设备发送的数据。在服务中,我编写了记录数据的代码 现在考虑一个正常的日志记录场景,其中只有一个GPS设备。< /P> 08:00:24可用方法 08:00:25接收到数据-设备Id:2数据:abcdefghijkl 08:00:25离开昂达塔机场 还有几句话。然后它重复 现在,当我有一个以上的GPS设备发送数据时,日志变得复杂。也就是说,我有以下类型的日志: 08:00:23内部OnDataAvail

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

现在考虑一个正常的日志记录场景,其中只有一个GPS设备。< /P> 08:00:24可用方法

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

08:00:25离开昂达塔机场

还有几句话。然后它重复


现在,当我有一个以上的GPS设备发送数据时,日志变得复杂。也就是说,我有以下类型的日志:

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

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

08:00:25离开昂达塔机场

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

08:00:26离开昂达塔机场

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


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

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

这篇文章很好地解释了它的工作原理:

总而言之,您可以像这样配置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>
private void OnDataAvailable(string id, int data)
{
  ThreadContext.Properties["DeviceID"] = id;

  logger.Info("Inside OnDataAvailable");

  logger.Info("Leaving OnDataAvailable");
}

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

是的,存在多个线程,因为它只会混淆,如果有多个线程在同一个日志文件上写入,我想我们需要编写log4net.Config.XmlConfigurator.Configure();让它工作。