【问题标题】:Log4Net Writing to different filesLog4Net 写入不同的文件
【发布时间】:2014-07-22 11:37:24
【问题描述】:

我正在制作一个车辆跟踪应用程序(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。

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

【问题讨论】:

    标签: log4net log4net-configuration log4net-appender


    【解决方案1】:

    您应该能够使用其中一个上下文对象(如 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 命名。

    【讨论】:

    • 是的,有多个线程,因为如果有多个线程写入同一个日志文件,它只会混乱。
    • 我认为我们需要编写 log4net.Config.XmlConfigurator.Configure();让它发挥作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多