0

log4net (C#) と Oracle を使用して、構成ファイルを使用する必要がないようにカスタム ADO アペンダーを作成しようとしています。これまでの私のコード

public static void CreateAppender()
{
    var hierarchy = (Hierarchy)LogManager.GetRepository();
    hierarchy.Root.RemoveAllAppenders();

    var ADOAppender = new AdoNetAppender();
   AddDateTimeParameterToAppender(ADOAppender, ":log_date", "log4net.Layout.RawTimeStampLayout");
   AddStringParameterToAppender(ADOAppender, ":thread", 255, "%thread");
   AddStringParameterToAppender(ADOAppender, ":log_level", 50, "%level");
   AddStringParameterToAppender(ADOAppender, ":logger", 255, "%logger");
   AddStringParameterToAppender(ADOAppender, ":message", 30000, "%message");

   ADOAppender.ConnectionType =
            "System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

   ADOAppender.CommandText =
            "INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)";

   ADOAppender.ConnectionString = "data source=[db];User ID=[id];Password=[pass]";

   ADOAppender.BufferSize = 1;

  ADOAppender.ActivateOptions();

  log4net.Config.BasicConfigurator.Configure(ADOAppender);
}

public static void AddDateTimeParameterToAppender(AdoNetAppender appender, string paramName, string conversionPattern)
{
       var param = new AdoNetAppenderParameter { ParameterName = paramName, DbType = System.Data.DbType.DateTime, Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern)) };
   appender.AddParameter(param);
}

public static void AddStringParameterToAppender(AdoNetAppender appender, string paramName, int size, string conversionPattern)
{
   var param = new AdoNetAppenderParameter
   {
      ParameterName = paramName,
      DbType = System.Data.DbType.String,
      Size = size,          
      Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern))
   };
appender.AddParameter(param);

}

例外は発生していませんが、データベースにデータが挿入されていません。すべての値をnullに設定すると機能するため、パラメーターに関係しているとほぼ確信しています。

誰かが私が間違っていることを見ていますか? 私はたくさんグーグルで検索しましたが、私が見つけた例のどれもADOアペンダーを使用していませんでした。ありがとう

4

2 に答える 2

1

私は ADONetAppender で同様の経験をしました。内部 log4net デバッグをオンにしましたか? 問題の詳細は覚えていませんが、デバッグを有効にした後、問題を解決することができました。

http://logging.apache.org/log4net/release/faq.html#internalDebug

また、確かに持っていると思いますが、プロジェクトに「XmlConfigurator」行があることを確認してください。

詳細はこちら: Log4Net がデータベースに書き込んでいない

于 2013-04-24T21:33:58.810 に答える
0

Tobyb さん、返信ありがとうございます。自分が間違っていたことがわかりました。DateTime パラメータを追加するときに、RawTimeStampLayout() である必要があるときにレイアウトを Layout2RawLayoutAdapter に設定しました。と交換Layout = new Layout2RawLayoutAdapter(new PatternLayout(conversionPattern))する必要がありましたLayout = new RawTimeStampLayout()。更新された AddDateTimeParameterToAppender メソッドは次のようになります。

public static void AddDateTimeParameterToAppender(AdoNetAppender appender, string paramName)
{
    var param = new AdoNetAppenderParameter
    {
        ParameterName = paramName, 
        DbType = System.Data.DbType.DateTime,
        Layout = new RawTimeStampLayout()
    };

    appender.AddParameter(param);
}
于 2013-04-25T15:57:38.667 に答える