我有一个并行的 ForEach 调用另一种方法来进行一些处理,在另一种方法中我使用 Enterprise Logging。目前日志都放在一个文件中,我想让每个线程创建自己的日志文件,至少每个满足特定条件的线程都有自己的日志文件。企业日志记录可以做到这一点吗?我在想我可以在配置文件中定义多个开关,然后在日志记录中使用这些开关,这样行吗
当前代码
Parallel.ForEach(
listOfAccounts,
new ParallelOptions { MaxDegreeOfParallelism = 10},
accountId =>
{
AccountProcess(accountId);
});
这是调用的方法:
private void AccountProcess(int accountId)
{
string msgPrefix = MethodBase.GetCurrentMethod().DeclaringType.Name + "." + MethodBase.GetCurrentMethod().Name;
_logWriter.WriteLog(msgPrefix, string.Format(" Starting AccountProcess method with accountId: {0} on threadID: {1}", accountId, Thread.CurrentThread.ManagedThreadId),
"Information", 0, 0, TraceEventType.Information);
try
{
_processor = new AccountProcessor(_logWriter);
bool result = _processor.AccountProcess(accountId);
_logWriter.WriteLog(msgPrefix, string.Format(" Account Process result: {0} on threadID: {1}", result.ToString(), Thread.CurrentThread.ManagedThreadId),
"Information", 0, 0, TraceEventType.Information);
}
catch(Exception ex)
{
_logWriter.WriteLog(msgPrefix,
string.Format("Error: {0}", ex.Message), "Error", 1, 1, TraceEventType.Error);
bool rethrow = ExceptionPolicy.HandleException(ex, "Fatal");
if (rethrow)
{
throw;
}
}
finally
{
_processor = null;
}
_logWriter.WriteLog(msgPrefix, string.Format(" Completed AccountProcess method with accountId: {0} on threadID: {1}", accountId, Thread.CurrentThread.ManagedThreadId),
"Information", 0, 0, TraceEventType.Information);
}
在 AccountProcess 方法中,我想将每个线程记录到一个新文件中。我是否需要为每个线程创建一个新的 LogWriter 实例,而不是使用 Enterprise logging V6 的单例。_logWriter 是企业日志记录版本 6 中 LogWriter 的 Singleton 实例的包装器,或者确实需要使用多个开关。我有三种类型的线程(每个线程都有一个基于 accountID 的属性。所以基于特定类型我可以使用特定的开关,例如。
<add switchValue="Type1" name="Information">
<listeners>
<add name="Informational Listener"/>
</listeners>
</add>
<add switchValue="Type2" name="Information">
<listeners>
<add name="Informational Listener"/>
</listeners>
</add>
<add switchValue="Type3" name="Information">
<listeners>
<add name="Informational Listener"/>
</listeners>
</add>
这种方法行得通吗?