Итак, у нас есть система регистрации, в которой мы используем Log.Info
, и она записывается в ILogger
.ThreadLocal и ждут
Теперь у нас есть несколько рабочих, работающих в фоновом режиме, и мы хотим, чтобы они записывали их в свои журналы. Так что все в комплекте для Рабочего. Все, что регистрируется при выполнении этой задачи, должно быть перенаправлено на собственный журнал.
Мы, где думаем о создании метода Log.SetLoggerForCurrentThread, реализуем его с помощью ThreadLocal. Исполнительный код будет выглядеть примерно так:
public class Worker
{
ILogger _Logger;
public void ExecuteTask()
{
Log.Info("This goes to the 'Global' logger");
using (Log.SetLoggerForCurrentThread(_Logger))
{
Log.Info("This goes to local logger");
DoWork();
}
}
private async void DoWork()
{
Log.Info("Starting...");
// SomeMethod does some logging,
// that also needs to be forwared to the local logger
var value = await SomeDeepDomainClass.SomeMethod();
// if we use ThreadLocal, and this thread has been reused,
// it could be a completely different logger that is now attached.
Log.Info("Ended...");
}
}
Вопросы
- Когда мы используем ждать, нить может в теории процесса работе на другом работник, таким образом, смешивая местные регистратор.
- Каков наилучший образец, чтобы сделать что-то подобное? Какой метод хранения я могу использовать?
- Как
CultureInfo
справиться с этим?
Справочная информация
Большинство из этих работников будет работать внутри экземпляра Azure WorkerRole, но теперь и чем они также вызвали (один раз) из приложения консоли.
'CultureInfo' устанавливается в начале каждой управляемой нити - это зависит от' Task'. Я бы порекомендовал явное использование «Log.SetLoggerForCurrentThread», если вы хотите войти в «Задачу». Это показывает, что вы явно подумали об этом и получили компенсацию. –
Прежде чем начать работу над ответом, вы должны знать, что log4net свободен и решает большинство ваших проблем. –
Привет @GuillaumeCR, возможно, вы правы, но рассматриваете его как общий вопрос программирования для похожих шаблонов. –