Problems with MappedDiagnosticsLogicalContext

Skip to first unread message


Jan 29, 2016, 6:41:05 AM1/29/16
to NLog-Users
I use MappedDiagnosticsLogicalContext, because I need data to flow in async calls. This is piece of my NLog.config:

<column name="UserId" layout="${mdlc:item=UserId}" />

But in some cases I need to disable flowing, and I don't know how to do it. For example, I have code that creates several threads (see comments):

void Run()
.Info("Starting threads...");  // MappedDiagnosticsLogicalContext.LogicalThreadDictionary is called and ConcurrentDictionary is created

(new Thread(Func1)).Start();  // both threads will refer to the same
ConcurrentDictionary object and share common values, because MappedDiagnosticsLogicalContext stores data in logical call context
(new Thread(Func2)).Start();

void Func1()
MappedDiagnosticsLogicalContext.Set("UserId", "123");
.Info("Some message for Func1");

void Func2()
.Info("Some message for Func2");  // UserId will be added to the log message here (because it was added in other thread), but I don't need it

I have found dirty workaround: at the beginning of the Func2(), I call 


Thus, when logging occurs in Func2(), getter of property MappedDiagnosticsLogicalContext.LogicalThreadDictionary will create new ConcurrentDictionary and threads will have separate instances of dictionaries. It would be good to have such a functionality in MappedDiagnosticsLogicalContext class. Or are there some other ways to fix problem?
Reply all
Reply to author
0 new messages