【问题标题】:Log exception at point of throwing and capture call stack在抛出点记录异常并捕获调用堆栈
【发布时间】:2013-01-24 16:39:59
【问题描述】:

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

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

    // Keep going...
}

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

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

我已经能够编写一些实用程序代码来完成这些项目中的大部分任务,但最后一个涉及捕获调用堆栈的代码让我望而却步。

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

我是不是找错树了?有没有另一种方法可以让我到达我想去的地方?

【问题讨论】:

    标签: c# exception log4net


    【解决方案1】:

    在寻找消除 cmets 中提到的额外帧问题的简单方法时,我遇到了 Environment.StackTrace。这可能更适合您的需求。

    原始答案如下。

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

    void ThrowLoggedException<T>() where T : Exception
    {
        try
        {
            throw new T("You did something bad");
        }
        catch (Exception ex)
        {
            // Log event here.
            throw;
        }
    }
    

    【讨论】:

    • 请注意,这会在调用堆栈中添加另一个条目。如果这是一个问题,您可能需要手动内联它。还需要加where T : Exception
    • 这样的事情可能会奏效。我试试看。
    【解决方案2】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2013-02-21
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多