如何正确地在.net
问题描述:
排除TransactionScope的日志我有一些像这样的代码:如何正确地在.net
using (var scope = GetTransactionScope())
{
... do stuff
InfoLogger.LogInformation("blah blah", "Blah blah", someEventId);
}
(注:GetTransactionScope()获取我的交易)。
但我不想在事务中涉及日志记录调用;呼叫LogInformation()
将呼叫包装到企业库中。
根据我的理解,我需要使用Suppress
TransactionScopeOption从交易中排除日志记录调用(是唯一的/最好的方式)?
假设是这种情况,我宁愿在我的帮手里面做 - 否则我会在整个地方有一个大型的SUV值得额外的TransactionScope代码......所以,这是最好的方式/可以接受的:
public static void LogInformation(string title, string message, int eventId)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
{
... do the real logging.
}
}
答
是,使用Suppress
选项将意味着“做真实的记录”的事务上下文以外发生。
但它取决于你记录什么和为什么;另一种方法是将所有日志记录数据放入生产者/消费者队列(即由独立线程服务的线程安全队列)。因为TransactionScope
是线程绑定的,所以这会消除您的事务关联,但它也具有在操作本身中将作为因素(延迟等)的日志记录删除的优点,并且允许您在选择时批量记录操作。
显然,这将只适用于信息记录,因为有机会(在边缘的情况下)从队列中的数据也会有少量再循环等
生产者/消费者进近过程中丢失是特别是如果您正在登录到一个文件,因为它允许您同步对文件的访问(这显然是必要的),而无需阻止IO本身(您只同步对队列的访问),因此很吸引人。