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

时间:2014-10-23 14:28:09

标签: c# log4net

我应该记录我的异常情况,以便了解所有细节?

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

我应该只传递变量ex还是应该这样做:

ex.InnerException + ex.Message + ex.Source

4 个答案:

答案 0 :(得分:4)

Error has a overload将异常作为参数之一。所以你的记录器应该是

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

然后,您有责任确保您的appender也设置为记录异常中的信息。如果您查看他们的appender examples他们有一个MS SQL上传器,将异常信息放入其自己的列中。

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

答案 1 :(得分:0)

我通常这样做是我的global.asax:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您正在捕获常规异常,那么只需使用.ToString(),因为除非您专门编写代码以查找异常,否则您不了解有关该异常的更多信息。 .ToString()将为您提供堆栈跟踪,以便您查看问题发生的位置。

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

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

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

基本上这一切都取决于异常以及您想知道的内容。

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