Log4Net Writing to different files
Asked Answered
R

1

1

I'm making a vehicle tracking application(ASP.NET MVC C#). I have windows service that takes data sent by GPS device. In the service I have written the code to Log the data.

Now consider a normal logging scenario in which i have only one GPS device.

08:00:24 Inside OnDataAvailable Method

08:00:25 Data Received - Device Id: 2 Data: abcdefghijkl

08:00:25 Leaving OnDataAvailable

and few more statements. and then it repeats


Now when I have more than one GPS device sending data, the log gets mixed. That is I have following kind of log:

08:00:23 Inside OnDataAvailable Method 08:00:24 Inside OnDataAvailable Method

08:00:25 Data Received - Device Id: 2 Data: abcdefghijkl

08:00:25 Leaving OnDataAvailable

08:00:26 Data Received - Device Id: 1 Data: abcdefghijkl

08:00:26 Leaving OnDataAvailable

Now what I want to achieve is that, I should have different log files for different devices. So for device with Id 1 I have Log_D1.txt, For Device Id 2, Log_D2.txt.

Would appreciate if someone can point me in the right direction.

Roybal answered 22/7, 2014 at 11:37 Comment(0)
F
3

You should be able to use one of the context objects (like ThreadContext.Properties) to build the filename. You can configure the log file name to use properties to build up the name. So, in your case, you might store the device id in the context (are your requests being handled in separate threads?).

This article has a good explanation of how this works:

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

To summarize, you can configure your appender something like this:

<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>

Note the use of %property in the filename specification.

Then, in your code, you might do something like this:

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

  logger.Info("Inside OnDataAvailable");

  logger.Info("Leaving OnDataAvailable");
}

All log messages, at least in cases where the DeviceID property has been set, should be segregated into separated files, named, in part, by the DeviceID.

Fighterbomber answered 22/7, 2014 at 15:52 Comment(2)
Yes there are multiple threads, because it will only jumble up, if there are multiple threads writing on the same log file.Roybal
I think we will need to write log4net.Config.XmlConfigurator.Configure(); to make it work.Roybal

© 2022 - 2024 — McMap. All rights reserved.