[英]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.