I am glad you were able to sort this out. To answer that last question it
might be best to dig into the log4net source by yourself. It is not
complicated after all.

Best regards

On 25 Jul 2014 02:55, "Ananth Tatachar" <ananth.tatac...@gmail.com> wrote:
>
> Hi Dominik I solved my issue. There was a delegate statement which was
causing all the trouble.
> However I still dont understand the need of LoggingEventData and why all
the properties in my loggingEvent object are null before calling
loggingEvent.GetLoggingEventData(); I'll be grateful if you could help me
with this.
> Thanks a lot..
>
>
> On Thu, Jul 24, 2014 at 10:38 AM, Ananth Tatachar <
ananth.tatac...@gmail.com> wrote:
>>
>> Sorry I forgot to mention : My application is multithreaded and the
log4net version = 1.2.12
>>
>>
>> On Thu, Jul 24, 2014 at 10:32 AM, Ananth Tatachar <
ananth.tatac...@gmail.com> wrote:
>>>
>>> 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":fgsg4678xzv-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