簡體   English   中英

使用log4net時記錄異常的最佳方法是什么

[英]What is the best thing to log for an exception when using log4net

我應該在例外中登錄什么內容,以便我可以查看所有詳細信息?

catch(Exception ex)
{
  Logger.Error("Users.GetUser " + ex.??????);
}

我應該只傳遞變量ex還是應該做的:

ex.InnerException + ex.Message + ex.Source

Error 具有重載該重載會將異常作為參數之一。 因此,您的記錄器應采用以下形式

catch(Exception ex)
{
  Logger.Error("Users.GetUser", ex);
}

然后,您有責任確保還設置了附加程序來記錄來自異常的信息。 如果查看他們的附加器示例,則它們具有MS SQL Appeneder,可將異常信息放入其自己的列中。

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>

我通常這樣做是我的global.asax:

  Exception lastErrorWrapper = Server.GetLastError();
        Log.Error(lastErrorWrapper);       

您應該使用ILog.Error(string, exception)方法記錄錯誤。 這將為您提供所有相關的異常信息-異常類型,消息和堆棧跟蹤將全部顯示:

log.Error("Construction of Foo failed due to the following exception", ex);

如果要根據代碼中的值構建自定義日志條目,請使用ILog.*Format(string, params object[] args)方法:

int i = 20; int y = 25
log.InfoFormat("The value of i is {0}, and the value of x is {1}", i, x);

如果您正在捕獲一般的Exception,則只需使用.ToString()因為您對該異常一無所知,除非您專門編寫代碼來查找。 .ToString()將為您提供堆棧跟蹤,使您可以查看問題發生的位置。

catch(Exception ex)
{
  Logger.Error("Users.GetUser " + ex.ToString());
}

如果要捕獲特定的異常類型,則需要記錄該異常內的某些詳細信息,這將需要您診斷問題。 以WebException為例。 您可能想知道什么是內容類型。 此信息在普通的.ToString()日志中不可用。

catch(WebException webex)
{
    Logger.Error(webex.Response.ContentType);
}

基本上,這一切都取決於異常以及您想知道的內容。

您需要問自己的問題是:“如果發生錯誤,我需要什么才能診斷出問題。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM