【问题标题】:How to correctly exclude logging from TransactionScope in .Net如何在 .Net 中正确地从 TransactionScope 中排除日志记录
【发布时间】:2011-04-27 05:42:22
【问题描述】:

我有一些这样的代码:

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.
    }
}

【问题讨论】:

    标签: .net logging transactions transactionscope


    【解决方案1】:

    是的,使用 Suppress 选项将意味着“执行真正的日志记录”发生在事务上下文之外。

    但这在一定程度上取决于您记录的内容以及原因;另一种方法是将所有日志数据放入生产者/消费者队列(即由单独线程服务的线程安全队列)。因为TransactionScope 是线程绑定的,所以这会删除您的事务关联,但它还具有将 logging 作为操作本身的一个因素(延迟等)删除的优点,并允许您批量处理如果您愿意,可以记录操作。

    显然这仅适用于信息性日志记录,因为有可能(在极端情况下)队列中的少量数据会在回收等过程中丢失。

    生产者/消费者方法特别是在您登录到文件时非常诱人,因为它允许您同步对文件的访问(这显然是必要的),而无需阻塞IO 本身(您只是同步访问队列)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-07-02
      相关资源
      最近更新 更多