在抛出和捕获调用堆栈时记录异常

时间:2013-01-24 16:39:59

标签: c# exception log4net

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

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

    // Keep going...
}

我正在使用log4net,理想情况下我想记录该异常,并提出以下警告:

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

我已经能够编写一些实用程序代码来完成大部分项目符号,但最后一项涉及捕获调用堆栈的内容正在逃避我。

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

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

我将它与Log2Console结合使用,以实时查看记录的内容。