使用log4net时,记录异常的最佳方法是什么

本文关键字:最佳 方法 是什么 异常 记录 log4net 使用 | 更新日期: 2023-09-27 18:27:39

我应该在异常中记录什么,以便可以查看所有详细信息?

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

我应该只传递变量ex还是应该执行:

ex.InnerException + ex.Message + ex.Source

使用log4net时,记录异常的最佳方法是什么

Error有一个重载,它将异常作为参数之一。所以你的记录器应该在形式

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

然后,您有责任确保您的appender也被设置为记录异常中的信息。如果你看看他们的appender示例,他们有一个MSSQL 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>

您应该使用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);

我通常这样做是我的全局.asax:

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

如果您正在捕获一般异常,那么只需使用.ToString(),因为除非您专门编写代码来查找,否则您对该异常一无所知。.ToString()将为您提供堆栈跟踪,使您可以查看问题发生的位置。

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

如果您正在捕获特定的异常类型,那么您需要记录该异常中的某些详细信息,以便诊断问题。以WebException为例。您可能想知道内容类型是什么。此信息在正常的.ToString()日志中不可用。

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

基本上,这一切都取决于例外情况和你想知道的内容。

你需要问自己的问题是:"如果发生错误,我需要什么来诊断问题。"