所以我们有一个日志系统,我们使用Log.Info
并写入。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
如何处理?
背景资料
大多数工人将一个蓝色的WorkerRole实例中运行,但现在比他们还触发(一次)从一个控制台应用程序。
'CultureInfo'被设置在每个托管线程的开始 - 这是独立Task'的'。如果你想从'Task'登录,我建议显式使用'Log.SetLoggerForCurrentThread'。它表明你明确地想到了这一点并得到了补偿。 – 2014-10-02 13:40:38
在我开始编写答案之前,您应该知道log4net是免费的,并且已经解决了大部分问题。 – 2014-10-02 13:42:06
Hi @GuillaumeCR,你可能是对的,但将它看作是类似模式的一般编程问题。 – 2014-10-02 13:47:45