1

假设我有一些这样的应用程序代码:

public void DoSomething()
{
    if (SomethingBad)
        throw new SomethingBadException("You did something bad");

    // Keep going...
}

我正在使用 log4net,理想情况下我想记录该异常,但需要注意以下几点:

  • 我现在想记录异常,而不是依赖调用者来记录它
  • 我想使用此类拥有的 Logger 记录异常,以便记录器名称正确
  • 我不希望SomethingBadException 了解日志记录,因为有时我想记录这种特定的异常类型,而有时我不想。我还想对内置异常类型使用相同的模式,例如 NotSupportedException
  • 我想要一个可重用的模式,其中异常/日志语句不太复杂,因为我将有很多这样的。如果这涉及创建一个可以完成大部分工作的实用程序类,那很好。
  • 我想记录包括调用堆栈在内的异常,这意味着它必须在抛出后记录。在构造异常之后但在它被抛出之前记录它,在日志输出中给我一个空的调用堆栈。

我已经能够编写一些实用程序代码来完成大多数项目符号,但是最后一个涉及捕获调用堆栈的代码让我望而却步。

有没有办法完成所有这些?我愿意编写自定义 log4net 扩展。如果有帮助,我还使用 Ninject 的 log4net 扩展来构建记录器。

我在吠叫错误的树吗?有没有另一种方法可以让我到达我想去的地方?

4

2 回答 2

2

在寻找一种简单的方法来消除评论中提到的额外框架问题时,我遇到了 Environment.StackTrace。这可能更适合你想要的。

原始答案如下。

不知道 log4net,但我希望像下面这样的东西会做你想要的。

void ThrowLoggedException<T>() where T : Exception
{
    try
    {
        throw new T("You did something bad");
    }
    catch (Exception ex)
    {
        // Log event here.
        throw;
    }
}
于 2013-01-24T16:51:40.870 回答
0

使用 NLog - http://nlog-project.org/

在更高级的 Log4j 样式输出布局中,它提供了很多关于要记录哪些数据的选项。

我将它与 Log2Console 结合使用来实时查看正在记录的内容。

于 2013-01-24T16:42:37.243 回答