1

同様の質問を見つけましたが、どれもうまくいきませんでした。

Log4Net はログ データベースに何も書き込まず、エラーを見つける方法がよくわかりません。

これは私の設定ファイルです:

<log4net>
<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=sqlServer;initial catalog=Logging;integrated security=false;persist security info=True;User ID=logUser;Password=logPassword" />
    <commandText value="INSERT INTO dbo.myLogTable ([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>
</log4net>

実際には、Apache ページにある SQL Server の例の完全なコピーです。接続文字列のみを変更しました。接続自体は正常に機能するはずです。接続文字列をSqlConnection.

これは、ログ オブジェクトを作成して構成を読み込む方法です。

public static class LogFactory
{
    public const string Log4NetConfig = "log4net.config";

    public static ILog GetLogger()
    {
        var uri = new Uri(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase), Log4NetConfig));
        var configFile = new FileInfo(Path.GetFullPath(uri.LocalPath));
        XmlConfigurator.ConfigureAndWatch(configFile);
        ILog log = LogManager.GetLogger(typeof(LogFactory));
        return log;
    }
}

ロギング自体:

private static readonly ILog Log = LogFactory.GetLogger();
[...]
Log.Info("Test 123");

構成を通常の「ファイルへのログ」構成に置き換えると、ログは正常に機能するため、エラーは構成のどこかにあるはずですが、構成はホームページのデフォルトの例です。

どこかにエラーが表示されますか?

4

3 に答える 3

3
<bufferSize value="100" />

これは、Log4Net がデータベースに挿入する前に 100 レコードをメモリに保持することを意味します。

これは、データベースへのラウンドトリップを制限するための設計です。設定してみてください<bufferSize value="1" />。または、0 が機能する可能性があります。

于 2013-10-28T12:59:11.297 に答える
0

AdoNetAppender を使用しているときに、ログの詳細をデータベースに書き込むことができません。以下は、実行可能なソリューションにするために行われた変更です: 1) bufferSize value="1" または bufferSize value="0" を使用します 2) 'root' ディレクトリは、使用されたすべての Appender の前に使用する必要があります

例えば。

    <root>
      <level value="ALL"></level>
      <appender-ref ref="AdoNetAppender"></appender-ref>
      <appender-ref ref="RollingFileAppender"></appender-ref>
    </root>

    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="mylogfile.txt" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
      </layout>
    </appender>

    <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=server_name; initial catalog=database_name;integrated security=false; persist security info=True;User ID=user_id;Password=password" />
      <commandText value="INSERT INTO ErrorLog ([Logger]) VALUES (@logger)" />
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="100" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
 </appender>

  </log4net>
于 2015-08-14T07:02:25.130 に答える