2011-04-27 69 views
3

排除TransactionScope的日志我有一些像这样的代码:如何正确地在.net

using (var scope = GetTransactionScope()) 
{ 
    ... do stuff 
    InfoLogger.LogInformation("blah blah", "Blah blah", someEventId); 
} 

(注:GetTransactionScope()获取我的交易)。

但我不想在事务中涉及日志记录调用;呼叫LogInformation()将呼叫包装到企业库中。

根据我的理解,我需要使用SuppressTransactionScopeOption从交易中排除日志记录调用(是唯一的/最好的方式)?

假设是这种情况,我宁愿在我的帮手里面做 - 否则我会在整个地方有一个大型的SUV值得额外的TransactionScope代码......所以,这是最好的方式/可以接受的:

public static void LogInformation(string title, string message, int eventId) 
{ 
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
     ... do the real logging. 
    } 
} 

回答

4

是,使用Suppress选项将意味着“做真实的记录”的事务上下文以外发生。

但它取决于你记录什么和为什么;另一种方法是将所有日志记录数据放入生产者/消费者队列(即由独立线程服务的线程安全队列)。因为TransactionScope是线程绑定的,所以这会消除您的事务关联,但它也具有在操作本身中将作为因素(延迟等)的日志记录删除的优点,并且允许您在选择时批量记录操作。

显然,这将只适用于信息记录,因为有机会(在边缘的情况下)从队列中的数据也会有少量再循环等

生产者/消费者进近过程中丢失是特别是如果您正在登录到一个文件,因为它允许您同步对文件的访问(这显然是必要的),而无需阻止IO本身(您只同步对队列的访问),因此很吸引人。