如何从.Net中的TransactionScope中正确排除日志记录

如何从.Net中的TransactionScope中正确排除日志记录,.net,logging,transactions,transactionscope,.net,Logging,Transactions,Transactionscope,我有一些这样的代码: using (var scope = GetTransactionScope()) { ... do stuff InfoLogger.LogInformation("blah blah", "Blah blah", someEventId); } (注意:GetTransactionScope()获取事务) 但我不想在事务中涉及日志调用;LogInformation()调用包装了对企业库的调用 据我所知,我需要使用Suppress从事务中排除日志调用(这是唯一/

我有一些这样的代码:

using (var scope = GetTransactionScope())
{
  ... do stuff
  InfoLogger.LogInformation("blah blah", "Blah blah", someEventId);
}
(注意:GetTransactionScope()获取事务)

但我不想在事务中涉及日志调用;
LogInformation()
调用包装了对企业库的调用

据我所知,我需要使用
Suppress
从事务中排除日志调用(这是唯一/最好的方法吗)

假设是这样的话,我宁愿在我的助手内这样做-否则我会有一个大型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本身(您只是同步对队列的访问)