Я пытаюсь найти способ записи полезного контекста из кучи потоков. Проблема в том, что большое количество кода рассматривается в событиях, которые поступают через потоки threadpool (насколько я могу судить), поэтому их имена не относятся к какому-либо контексту. Проблема может быть продемонстрирована с помощью следующего кода:
class Program
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
static void Main(string[] args)
{
new Thread(TestThis).Start("ThreadA");
new Thread(TestThis).Start("ThreadB");
Console.ReadLine();
}
private static void TestThis(object name)
{
var nameStr = (string)name;
Thread.CurrentThread.Name = nameStr;
log4net.ThreadContext.Properties["ThreadContext"] = nameStr;
log4net.LogicalThreadContext.Properties["LogicalThreadContext"] = nameStr;
log.Debug("From Thread itself");
ThreadPool.QueueUserWorkItem(x => log.Debug("From threadpool Thread: " + nameStr));
}
}
Образец преобразования:
%date [%thread] %-5level %logger [%property] - %message%newline
Результат выглядит так:
2010-05-21 15:08:02,357 [ThreadA] DEBUG LogicalContextTest.Program [{LogicalThreadContext=ThreadA, log4net:HostName=xxx, ThreadContext=ThreadA}] - From Thread itself
2010-05-21 15:08:02,357 [ThreadB] DEBUG LogicalContextTest.Program [{LogicalThreadContext=ThreadB, log4net:HostName=xxx, ThreadContext=ThreadB}] - From Thread itself
2010-05-21 15:08:02,404 [7] DEBUG LogicalContextTest.Program [{log4net:HostName=xxx}] - From threadpool Thread: ThreadA
2010-05-21 15:08:02,420 [16] DEBUG LogicalContextTest.Program [{log4net:HostName=xxx}] - From threadpool Thread: ThreadB
Как вы можете видеть, последние две строки не имеют имен полезной информации, чтобы отличать 2 потока, кроме как вручную добавлять имя в сообщение (чего я хочу избежать). Как я могу получить имя/контекст в журнал для потоков threadpool, не добавляя его в сообщение при каждом вызове или не нуждаясь в том, чтобы снова установить свойство в каждом обратном вызове.