Hi Dominik Psenner ,

Thanks a lot for replying , I am really sorry about my bad explanation of
my problem.

I am trying to create a custom Json Layout ,

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1) The custom layout class:


 class MyJsonLayout:LayoutSkeleton
    {
        private HashSet<String> IncludeFieldsList { get; set; }

        public override void ActivateOptions()
        {

        }

        public override void Format(TextWriter writer, LoggingEvent
loggingEvent)
        {
            if(writer == null || loggingEvent == null)
            {
                throw new ArgumentNullException();
            }
            var myJsonObj = new MyJsonObject(loggingEvent,
IncludeFieldsList );
            var json =
JsonConvert.SerializeObject(myJsonObj,Formatting.None);
            writer.WriteLine(json);
        }
    }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2) The MyJsonObject class:

[JsonObject(MemberSerialization.OptIn)]
class MyJsonObject
    {
        [JsonProperty("@timestamp")]
        private DateTime TimeStamp { get; set; }

        [JsonProperty("@message", NullValueHandling =
NullValueHandling.Ignore)]
        private String Message { get; set; }

        [JsonProperty("@tid", NullValueHandling = NullValueHandling.Ignore)]
        private String Tid {get;set;}

        [JsonObject(MemberSerialization.OptIn)]
        private String MyGuid {get;set;}

       public MyJsonObject(LoggingEvent loggingEvent)
       {
            var lgData = loggingEvent.GetLoggingEventData(); // For some
reason if I dont do this , all the loggingEvent.Properties are null. I did
not understand this.
            TimeStamp = loggingEvent.TimeStamp;
            MyGuid = loggingEvent.Properties["myguid"];
            //loggingEvent.Properties.Remove("myguid"); I tried doing this
, but nothing changed in my output.
            Message = loggingEvent.Properties["message"];
            Tid = loggingEvent.Properties["tid"];
       }

    }

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3) The Place where I put data into log4net.ThreadContext.Properties:

class MyInstatntiationClass
    {
        log4net.ThreadContext.Properties["myguid"] =
Guid.NewGuid().ToString();
        log4net.ThreadContext.Properties["tid"]
= System.Threading.Thread.CurrentThread.ManagedThreadId.ToString();
    }


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4) My Web.config file:



<appender name="RollingLocalFileAppender"
type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="C:\Logs\JSON.log" />
      <rollingStyle value="Date" />
      <datePattern value="yyyy-MM-dd" />
      <maxSizeRollBackups value="10" />
      <appendToFile value="true" />
      <layout type="MyJsonLayout, Version=1.0.0.0, Culture=neutral">
      </layout>
    </appender>


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

5) Output file:


{"@timestamp":"2014-07-24T10:20:32.1223183-04:00"
,"@tid":"5","@myguid":dfg134xcd_dfe-123uier00"}
{"@timestamp":"2014-07-24T10:20:32.3213382-04:00","@tid":"5","@myguid":
dfg134xcd_dfe-123uier00"}
{"@timestamp":"2014-07-24T10:20:32.8273888-04:00","@tid":"5","@myguid":
dfg134xcd_dfe-123uier00"}
{"@timestamp":"2014-07-24T10:20:32.8273888-04:00","@tid":"6","@myguid":fgsg
4678xzv-adfry-2356i"}


Expected behaviour:

Each of my calls should result in unique guids. But as you can see I am
getting stale guids.


---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


I have two concerns :

1) As you can see in the output file the guid are stale. While executing I
carefully monitered the place where guid is being generated : in file
number 3 in this file: MyInstatntiationClass.
All the generated guids were unique , however while logging I got stale
data. Also One other thing I noticed was , when I put the current thread to
sleep for 50 ms , I see valid unique guids in the output.
I believe old thread data is being used.


2) I did not understand the use of LoggingEventData. In file number 2 :
MyJsonObject , If I dont make this call :var lgData =
loggingEvent.GetLoggingEventData(); I get null values from
loggingEvent.Properties.




Thanks a lot for your help in advance ...















On Thu, Jul 24, 2014 at 2:40 AM, Dominik Psenner <dpsen...@gmail.com> wrote:

> Hi Ananth Tatachar,
>
> I'm having a hard time understanding your problem. Can you provide us a
> sample application including all the code together with both a broken
> sample output and a expected sample output? It would also be interesting
> which exact version of log4net you are using.
>
> Best regards
>
>
>
> 2014-07-24 2:31 GMT+02:00 Ananth Tatachar <ananth.tatac...@gmail.com>:
>
>
>>
>> ---------- Forwarded message ----------
>> From: Ananth Tatachar <ananth.tatac...@gmail.com>
>> Date: Wed, Jul 23, 2014 at 8:24 PM
>> Subject: Log4net.ThreadContext.Properties Having stale data. How to
>> resolve it?
>> To: log4net-user@logging.apache.org
>>
>>
>> I am using a RollingFileAppender , and my own custom layout. My
>> application is multithreaded. Each thread will generate unique random data
>> and is supposed to log it using log4net framework. However if I create
>> multiple threads in quick succession I notice stale data in my logs , this
>> goes away if each thread sleeps for 50 ms before logging. I am not able to
>> figure out a solution to this issue or find its cause please do help me.
>>
>> My logging function looks like this:
>>
>>
>>     log4net.ThreadContext.properties["randomGeneratedData"] =
>> randomGeneratedData;
>>     private ILog myLog =
>>            LogManager.GetLogger(typeof(LogTest));
>>     using (log4net.NDC.Push("ndcTest1"))
>>     {
>>         using (log4net.NDC.Push("ndcTest2"))
>>             {
>>                 myLog.Info("myLogTest");
>>             }
>>     }
>>
>>
>>
>>
>>
>> Result of logging:
>>
>>         NDC = "ndcTest1 ndcTest2" , randomGeneratedData = rad1
>>        NDC = "ndcTest1 ndcTest2" , randomGeneratedData = rad2
>>        NDC = "", randomGeneratedData = rad2
>>
>> and so on ...
>>
>>
>> I tried to clear log4net.ThreadContext.Properties before filling it again
>> , but it was of no use. Please help.
>>
>>
>
>
> --
> Dominik Psenner
>

Reply via email to