1

私は log4net を使用しており、AdoNetAppender を使用してデータベースにログインするように XML ファイルを構成しました。アプリケーションを作成してすべてを構成すると、すべてが正常に機能するようです。そして、データベースに正常にログインできます。しかし、コード内のメッセージを変更すると、データベースへのログ記録が停止します。

これが私の構成です:

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
  <bufferSize value="0" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="Server=USER-PC;Integrated Security=SSPI;Initial Catalog=mydb;Trusted_Connection=true;"/>
  <commandText value="INSERT INTO Log1 ([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">
      <converter>
        <name value="hex_thread" />
        <type value="MyWebApplication.HexPatternConverter" />
      </converter>
      <conversionPattern value="%hex_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>

オンラインで見つけて、アプリケーションに合わせて少し変更しました。パラメータを取得する前にテーブル Log1 に挿入することが原因である可能性があると考えています。

私のコードが

 private static readonly ILog dblog = LogManager.GetLogger("ADONetAppender");
 dblog.Info("logging to db");

初めて機能し、次にメッセージを次のように変更します

dblog.Info("I AM LOGGING TO DB"); 
dblog.Info("me again");

まったく機能しません。私のファイル アペンダーはメッセージの変更を受け入れることができますが、私の AdoNetAppender はこれを拒否します。なぜこうなった?

追加するために編集:

私の関数は非常に単純です。ログを記録するためにこのクラスがあります。

using System; 
using System.Collections.Generic; 
using System.Linq; using System.Web;using log4net; 
using log4net.Config; using log4net.Core;
using log4net.Layout; using System.Text; 
using System.IO; 
using log4net.Layout.Pattern; 

namespace myWebApplication 
{

public sealed class HexPatternConverter : PatternLayoutConverter
{
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        long id;
        if (long.TryParse(loggingEvent.ThreadName, out id))
        {
            writer.Write(id.ToString("X"));
        }
        else
        {
            writer.Write(loggingEvent.ThreadName);
        }
    }
}

public class myClass
{
    private static readonly ILog secondlog = LogManager.GetLogger("methodB");
    private static readonly ILog thirdlog = LogManager.GetLogger("methodC");
    private static readonly ILog fourthlog = LogManager.GetLogger("methodD");
    private static readonly ILog fifthlog = LogManager.GetLogger("ADONetAppender");

    public static int methodA()
    {
        int a = 0;
        return a;
    }
    public static void methodB()
    {
        methodA();
        secondlog.Info("inside method B");
    }
    public static void methodC()
    {
        methodB();
        thirdlog.Info("inside method C");
    }

    public static void methodD()
    {
        methodC();
        fourthlog.Info("inside D");
        fifthlog.Info("this is db log");
        fifthlog.Info("this is me logging to the db");
    }
}

}

変更を加えるたびにファイル ログは問題ありませんが、テーブルのデータを取得しようとしても変更がないため、DB ログはデータベースに書き込まれません。何が間違っているのかわかりません。

私のロガー構成

<logger name="ADONetAppender">
<appender-ref ref="ADONetAppender"/>
</logger>
<logger name="methodB">
  <appender-ref ref="methodB"/>
</logger>
<logger name="methodC">
  <appender-ref ref="methodC"/>
</logger>
<logger name="methodD">
  <appender-ref ref="methodD"/>
</logger>
<root>     
</root>

最後の 3 つはRollingFileAppenders で、メッセージを変更したり、他のいくつかのメッセージを追加したりしても、完全に機能します。メッセージを変更したり、ログに記録するメッセージをいくつか追加したりすると、頭痛の種になるのはDBです。

4

2 に答える 2

0

まず、バッファ サイズを 0 ではなく 1 に変更します。

2 番目: 最初のログ メッセージが機能している場合、構成ファイルは問題ありません。それはおそらくあなたのコードの残りの部分にあります。もう少し見せてください。

複雑な場合は、非常に単純な関数を 1 つまたは 2 つ使用してテストし、何が起こるかをお知らせください。

編集して追加

さて、あなたのコードを見て、それHexPatternConverterが 1 つの列をフォーマットするために使用されていることがわかりました: 例外をスローするなど、何か問題が発生している可能性があります。そのクラスを使用せずに (Thread 列を単純な文字列として書き込むだけで) これを実行して、何かが変わるかどうかを確認することをお勧めします。

また、ご存じない場合に備えて、log4net で SQL の問題が発生すると、警告なしで失敗します。この場合、少なくともいくつかのレコードを書き込んでいるので、それはありそうにないように思えますが、それでもです。

編集して追加

構成ファイルを変更すると、IIS はアプリケーション全体をリロードするため、リソースが不足している可能性があります。他のデータベース活動はありますか? それも止まる?データベース接続を開いて閉じるのを忘れている可能性はありますか? これにより、アプリが再起動するまでデータベース アクティビティが失敗します。

編集して追加

構成ファイルの ConnectionString は接続を開きません。これは、プログラム (またはこの場合は log4net) が参照できる場所にすぎません。log4net 以外の DB アクティビティを行っていない場合は、おそらく接続の問題ではありません。

次に試すこと: log4net には、テキスト ファイル Appender でこの問題がありますか?

于 2010-07-07T05:01:59.480 に答える
0

最後に、OOHはうまく機能しました...global.asaxに含まれているはずのないコードがいくつかあります。コードを削除してみましたが、うまくいきました。これで、何度変更してもすぐに書き込みができます。

これが何をするかわからないコードですが、オンラインで見つけたばかりです。私の場合は必要ありませんでした

 log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;

        if (hier != null)
        {
            //get ADONetAppender
            log4net.Appender.AdoNetAppender adoAppender =
              (log4net.Appender.AdoNetAppender)hier.GetLogger("ADONetAppender",
                hier.LoggerFactory).GetAppender("ADONetAppender");
            if (adoAppender != null)
            {
                adoAppender.ConnectionString =
                  System.Configuration.ConfigurationSettings.AppSettings["MyConnectionString"];
                adoAppender.ActivateOptions(); //refresh settings of appender
            }

        }

そして、それを削除した後、問題は解決しました。

于 2010-07-07T05:26:54.740 に答える