Log4Net日志记录异常

时间:2010-01-25 03:57:53

标签: .net asp.net logging exception-handling log4net

我知道我可以使用Log4Net将异常记录到数据库中,但我希望分解存储的异常分别存储到不同的列中。

有没有人知道这是否可用,是否有人这样做了,或者只是手动将异常记录到数据库更容易?

干杯 安东尼

更新:

如果有帮助,可以使用以下内容:

  • 有谁知道这是否可用?
    • 这些是我追求的细节:
      • ExceptionType
      • ExceptionMessage
      • ExceptionSource
      • ExceptionTargetSite
      • ExceptionStackTrace
  • 如果有人这样做了吗?
  • 手动将异常记录到数据库是否更容易?

也许格式的改变会有所帮助。

4 个答案:

答案 0 :(得分:2)

如果您不想使用ELMAH这样的内容,可能会通过覆盖Page.ProcessRequest来解决所有异常(狡猾,因为它仅标记为基础架构使用)

public override void ProcessRequest(HttpContext context)
{
    try
    {
        base.ProcessRequest(context);
    }
    catch (Exception e)
    {
        log.ErrorFormat(e.Message); // Log exception message, or
        log.ErrorFormat(e.ToString()); // Log stack trace
        throw;
    }
}

答案 1 :(得分:2)

根据要求,您可以使用此处列出的方法:Log4Net available database fields for adoappender - seems there are a few more i.e. method_name?使用log4net ThreadContext中的自定义属性来保存有关例外的额外信息,如下所示:

public void LogDetailedException (LogLevel level, string message, Exception exception)
{
    log4net.ThreadContext.Properties["exceptionType"] = exception.GetType().AssemblyQualifiedName;
    // appropriate logging statement
    log4net.ThreadContent.Properties.Remove("exceptionType"); // clear it, so it's not used in future calls
}

然后在你的模式中:

<conversionPattern value="%property{exceptionType}" />

值得测试/研究以确定这是否是线程安全的(名称暗示它是,但它不会伤害检查)。您还需要确保后续日志不会在其消息中包含此数据(即,确保它已被清除)。

(标记为维基,因为这不是我的答案,只是在Mitch's回答的评论中收集各种信息和讨论)。

答案 2 :(得分:2)

ELMAH是一个很棒的选择。鲜为人知的图书馆是CuttingEdge.Logging。就像ELMAH一样,它允许将异常类型,消息和堆栈跟踪记录到数据库中的表中。

答案 3 :(得分:-1)

使用AdoNetAppender Class或不符合您需求的,编写您自己的custom Appender