【问题标题】:Log4Net Logging ExceptionsLog4Net 日志记录异常
【发布时间】:2011-01-08 23:06:55
【问题描述】:

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

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

干杯 安东尼

更新:

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

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

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

【问题讨论】:

  • 说真的,你在找什么?如果自定义 Appender 太难,但 AdoNet appender 不够精细,你想要什么?你想突破什么数据?基于异常类型或消息内容?您在实现自己的 AdoNetAppender 修改版本时遇到了什么问题?
  • 什么是“手动将异常记录到数据库更容易?”什么意思?

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


【解决方案1】:

根据要求,您可以使用此处概述的方法: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}" />

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

(标记为 wiki,因为这不是我的具体答案,只是在Mitch's 答案的 cmets 中收集各种信息和讨论)。

【讨论】:

  • 谢谢。对此,我真的非常感激。对于我的问题,这是最好的答案,但我可能会求助于 ELMAH 进行错误处理而不使用 Log4Net。
【解决方案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;
    }
}

【讨论】:

  • 谢谢 Si... 这真的很有趣,我以前没听说过 ELMAH。我试图让 Log4Net 进行异常日志记录,而不仅仅是我的日志记录。但 ELMAH 可能是要走的路。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    使用AdoNetAppender Class,或者不满足你的需求,写你自己的custom Appender

    【讨论】:

    • 为什么会被否决? AdoNetAppender 让您可以分解事物,如果您需要更多粒度,那么您还可以遵循自定义附加程序的建议。
    • AdoNetAppender 类不会分解异常细节。通用答案“自定义 Appender”确实无助于回答问题。
    • Sam:它打破了日志的细节;您希望将哪些详细信息隐藏在要拆分为单独列的异常“消息”字符串中? (对我来说似乎很糟糕)。尽管如此,自定义附加程序是准确的,如果不是过于详细的话。每个人都需要用勺子喂吗?
    • @Mitch:很抱歉,但我想这只是同意不同意的情况。我不知道答案,所以我问这个问题。当人们在没有阅读问题的情况下回答问题时,这有点令人沮丧(从这里的投票来看,其他人似乎同意)。该问题几乎说明了您回答的内容,并且答案很笼统。如果您曾经说过不,它不存在,没有人这样做过,而且看起来您需要自己创建它,那么就不会有问题。但你的回答并没有真正帮助我,也许其他人会觉得它更有帮助。
    • vdh:一个人怎么能评论世界上所有人口是否都做了某事?答案中是否暗示,就研究而言,它不存在,您必须实施它?你还没有解释你想从异常中得到什么细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多