簡體   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