繁体   English   中英

Log4Net记录例外

[英]Log4Net Logging Exceptions

我知道我可以使用Log4Net将异常记录到数据库中,但是我想将异常存储在数据库中的内容分解到不同的列中。

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

干杯安东尼

更新:

如果有帮助,可以使用以下方法:

  • 有人知道这是否可用吗?
    • 这些是我追求的细节:
      • 异常类型
      • 异常消息
      • 异常来源
      • ExceptionTargetSite
      • ExceptionStackTrace
  • 如果有人这样做?
  • 将异常手动记录到数据库是否更容易?

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

如果您不想使用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;
    }
}

根据要求,您可以使用此处概述的方法: Log4Net adoappender的可用数据库字段-似乎还有更多方法,例如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}" />

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

(标记为Wiki,因为这不是我的具体答案,只是有关Mitch答案的评论中的各种信息和讨论的集合)。

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

使用AdoNetAppender类 ,或者使用不满足您需求的类,编写您自己的自定义Appender

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM