database - 将异常记录到 NServiceBus 中的数据库

标签 database logging exception log4net nservicebus

如果我的 MessageHandler 中发生异常,我想将异常详细信息写入我的数据库。 我该怎么做?

显然,我不能只捕获异常,写入数据库,然后重新抛出它,因为 NSB 回滚了所有更改。 (IsTransactional 设置为 true)

我尝试在单独的处理程序中添加日志记录功能,如果发生异常,我会使用 SendLocal 进行调用,但这不起作用:

public void Handle(MessageItem message)
{
    try
    {
        DoWork();
    }
    catch(Exception exc)
    {
        Bus.SendLocal(new ExceptionMessage(exc.Message));
        throw;
    }
}

我还尝试将 Log4Net 与自定义附加程序一起使用,但这也回滚了。

Configure.With()
.Log4Net<DatabaseAppender>(a => a.Log = "Log")

附加器:

public class DatabaseAppender : log4net.Appender.AppenderSkeleton
{
    public string Log { get; set; }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        if (loggingEvent.ExceptionObject != null)
            WriteToDatabase(loggingEvent.ExceptionObject);
    }
}

当 IsTransactional 为 true 时,是否可以在消息处理程序中记录未处理的异常?

提前致谢。

最佳答案

我建议使用配置文件而不是代码来配置附加程序。这样,无论谁操作您的软件,都可以决定如何记录内容。标准的 AdoNetAppender 具有以下配置开关:

<param name="UseTransactions" value="False" />

我认为这会按照你想要的方式工作。如果您确实想使用自己的附加程序,您可以查看 log4net 源代码,了解他们是如何做到这一点的。他们可能将 TransactionScope 类与 TransactionScopeOption.Suppress option 结合使用。 .

关于database - 将异常记录到 NServiceBus 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929441/

相关文章:

c# - nlog 登录到另一个目录

java - 另一种违反契约(Contract)的比较方法

exception - Hadoop:任务跟踪器不会启动 java.io.IOException

mongodb - 我们如何限制 mongodb 生成的日志文件的大小? (即/var/log/mongodb/*.log)

java - JUL 配置类应该如何(以及为什么)初始化?

database - MySQL Workbench 中完全可选的一对一关系

android - Room - 是否可以在查询中使用 OFFSET 和 FETCH NEXT?

java - 找不到适合响应类型 [class org.springframework.http.ResponseEntity] 和内容类型 [application/octet-stream] 的 HttpMessageConverter

mysql - 如何进行 Heroku Jawsdb InnoDB 数据库恢复?

javascript - 禁用 Jasmine 期望,例如 xdescribe 或 xit?