0

我有一个用于 log4net 的 ADO.NET Appender,插入了大多数人记录的基本日志信息。我想为“IsCritical”添加一个列,一个指示日志是否为 ERROR 或更高的位/标志。我已经阅读了有关自定义列插入的信息,但在这种情况下,它只是对日志中已经存在的数据进行格式化。这是我目前的 ADONetAppende。我还希望有一列具有表示日志级别字符串的日志级别值(数值)。

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
  <bufferSize value="1"/>
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=xxx"/>
  <connectionString value="Data Source=localhost\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True"/>
  <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES&#xD;&#xA;       (@log_date, @thread, @log_level, @logger, @message, @exception)"
                                                                   />
  <parameter>
    <parameterName value="@log_date"/>
    <dbType value="DateTime"/>
    <layout type="log4net.Layout.RawUtcTimeStampLayout"/>
  </parameter>
  <parameter>
    <parameterName value="@thread"/>
    <dbType value="String"/>
    <size value="32"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%t"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@log_level"/>
    <dbType value="String"/>
    <size value="512"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%p"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger"/>
    <dbType value="String"/>
    <size value="512"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%c"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message"/>
    <dbType value="String"/>
    <size value="4000"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%m"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception"/>
    <dbType value="String"/>
    <size value="2000"/>
    <layout type="log4net.Layout.ExceptionLayout"/>
  </parameter>
  <parameter>
    <parameterName value="@exception"/>
    <dbType value="String"/>
    <size value="2000"/>
    <layout type="log4net.Layout.ExceptionLayout"/>
  </parameter>

</appender>
4

1 回答 1

0

首先,我创建了一个自定义 AdoNetAppenderParameter:

public class IsCriticalAdoNetParameter : AdoNetAppenderParameter
{
    public override void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
    {
        // Lookup the parameter
        IDbDataParameter param = (IDbDataParameter)command.Parameters[ParameterName];

        param.Value = loggingEvent.Level > Level.Warn;
    }
}

接下来,我在 app.config 的 ADO Net Appender 中引用了它。请注意 Insert 语句和添加的<paramemter>标记中的更改。参数的 type 属性引用自定义附加程序的程序集/类名称。

 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
      <bufferSize value="1"/>
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=localhost\SQLEXPRESS;Initial Catalog=my_db;Integrated Security=True"/>
      <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception],[IsCritical]) VALUES&#xD;&#xA;       (@log_date, @thread, @log_level, @logger, @message, @exception, @is_critical)"
                                                                       />
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawUtcTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <size value="32"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%t"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="512"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%p"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <size value="512"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%c"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%m"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@exception"/>
        <dbType value="String"/>
        <size value="2000"/>
        <layout type="log4net.Layout.ExceptionLayout"/>
      </parameter>
      <parameter type="MyApp.Logging.IsCriticalAdoNetParameter">
        <parameterName value="@is_critical"/>
        <dbType value="Boolean"/>
        <size value="10"/>
        <layout type="log4net.Layout.PatternLayout" value=""/>
      </parameter>
    </appender>

你可以使用这个概念来创建你自己的 appender 参数。

于 2013-03-28T19:06:21.627 回答