Dominik,

I don't think you've seen the object that I'm talking about.  There is no 
getkeys() method on the threadcontext.  That's why I have the issue in the 
first place.  Looks like I'll need to read the configuration file to get the 
property names.  There is a getProperties method on the object, but it is 
declared as internal and so I cannot access it.

Thanks for trying though

From: Dominik Psenner [mailto:[email protected]]
Sent: Wednesday, July 31, 2013 2:00 PM
To: Log4NET Dev
Subject: Re: asynchronous logging

Easy as that:

http://logging.apache.org/log4net/release/sdk/log4net.Util.ReadOnlyPropertiesDictionary.GetKeys.html

2013/7/31 Farrington, Linda 
<[email protected]<mailto:[email protected]>>
Dominik,

Seems obvious, but in our case, it's not.   I am working within some apps that 
already exist that are calling this logging and trying to make these changes 
without disrupting them.

The app calls the logging like so:
Push properties onto the threadcontext  (fill threadcontext.properties)
Call Log.Debug  to log the error.  At this point, I am now in the append method 
in the asynchronous appender.  I have only the threading context to work with.  
I don't see an overload to pass additional properites.  So I am not sure how 
creating a separate properties dictionary would solve this.  (I am new to 
log4net, so it's possible I am missing the obvious)

Thanks,

Linda

From: Dominik Psenner [mailto:[email protected]<mailto:[email protected]>]
Sent: Wednesday, July 31, 2013 9:25 AM

To: Log4NET Dev
Subject: Re: asynchronous logging

I may be pointing out the obvious, but why don't you let both applications 
write to the same key a collection which lets your third application determine 
which fields are being sent:

string[] fields = Properties["fields"];
foreach(string field in fields) {
    string value = Properties[field];
}

Cheers

On 07/31/2013 03:10 PM, Farrington, Linda wrote:
My data is coming to me in the ThreadingContext.Properties collection.  There 
are about 10 elements in there.  I can't seem to find a way to get the data out 
of this collection as there is no way to iterate it and I don't know what the 
fields are named.  (We have two different applications and they pass in 
different data in the collection.

From: [email protected]<mailto:[email protected]> [mailto:[email protected]] On 
Behalf Of Chinh Do
Sent: Tuesday, July 30, 2013 10:07 PM
To: Log4NET Dev
Subject: Re: asynchronous logging

Yes I was referring to log4net.Core.LoggingEvent.Properties.

In my case, I know exactly what I need so I just had a few lines of code like 
this:

// Implementation of IAppender.DoAppend
public void DoAppend(LoggingEvent loggingEvent) {
    loggingEvent.Properties["ThreadId"] = 
Thread.CurrentThread.ManagedThreadId.ToString();
    loggingEvent.Properties["MyUserId"] = ...
    loggingEvent.Properties["MySessionId"] = ...
    ...
    AddToQueue(loggingEvent);
}


On Tue, Jul 30, 2013 at 5:42 PM, Farrington, Linda 
<[email protected]<mailto:[email protected]>> wrote:
Chinh Do,
Thanks for your suggestion.  This sounds like it might work.  I did not write 
this component, we are using one that someone else wrote and posted on github.  
Are you talking about the Properties() that is on the LoggingEvent object?  If 
so, there is a point in the code where I see the correct data in 
ThreadingContext.  I could get it out of there and put it into Properties.  
However, I have not been able to find a way to iterate through the 
ThreadingContext because it does not have a GetEnumerator on it. How are you 
able to get data out of the threadContext?

From: [email protected]<mailto:[email protected]> 
[mailto:[email protected]<mailto:[email protected]>] On Behalf Of Chinh Do
Sent: Tuesday, July 30, 2013 4:28 PM
To: Log4NET Dev
Subject: Re: asynchronous logging

What I did my my AsyncAppender was to write thread specific data into 
loggingEvent.Properties in the main thread, just before I add the loggingEvent 
to a queue. Then you can use "%P{<PropertyName>}" in your log4net config 
section to get them later in the other thread.

My AsyncAppender was based on log4net AsyncAppender example (see 
http://logging.apache.org/log4net/release/example-apps.html). The log events 
sent to AsyncAppender are forwarded asynchronously to a list of attached 
appenders.

On Tue, Jul 30, 2013 at 2:31 PM, George Chung 
<[email protected]<mailto:[email protected]>> wrote:
If you authored your own AsynchronousAdoNetAppender that uses the new .NET 
async/await constructs, you could use the TPL library to wrap the 
ado.net<http://ado.net> async operations as a Task.

Then if you avoid calling ConfigureAwait(false), I'm pretty sure the completion 
routine will complete on the original ASP.NET<http://ASP.NET> request thread, 
in which case you'll have access to the original HttpContext that started the 
request.


On Tue, Jul 30, 2013 at 8:31 AM, Farrington, Linda 
<[email protected]<mailto:[email protected]>> wrote:

We are trying to log asynchronously using an asynchronousadonetappender 
inherited from adonetappender.   Logging standard properties seems to work 
fine, but custom properties do not.  I understand that this is because the 
asynchronous appender is logging the messages on another thread and we're 
storing the custom properties in the logicalthreadcontext (tried threadcontext 
= as well to no avail).  My question is this:  If I cannot use the 
threadcontext when running asynchronously, how should I pass custom properties 
into log4net.  Has anyone else done this?  Can anyone provide any suggestions?



Thanks in advance,



Linda








--
http://www.chinhdo.com



--
http://www.chinhdo.com




--
Dominik Psenner
## OpenPGP Key Signature #################################
# Key ID: B469318C                                       #
# Fingerprint: 558641995F7EC2D251354C3A49C7E3D1B469318C  #
##########################################################

Reply via email to