1

Log4Net を使用したデータベースへのログ記録に問題があります。
私は自分の結果をどうするかよくわかりません。フィールドの値を取得する必要があるときに、フィールド名を取得し続けます。

プログラムは SystemTray ユーティリティです。Log4Net を次のように設定しました。

アセンブリで:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

Program.cs で:

 private static readonly ILog log = LogManager.GetLogger(typeof(Program));

        [STAThread]
        static void Main()
        {
            log4net.Config.XmlConfigurator.Configure();

呼び出しクラスで:

public class HostManager
{

    #region constants

        protected static readonly ILog log = LogManager.GetLogger(typeof(HostManager));

        ...

        // Inside an event method:

          try
            {

                log.Info(new Log
                {   
                    CreateDate = DateTime.Now.ToString(),
                    SystemUpTime = FormatUpTime(_states.TimeFromStart),
                    EmotivType = "boredom",
                    EmotivValue = _states.AffectivEngagementBoredomScore.ToString(),
                    EventTimer = _eventTimer,
                    SubEventTimer = _subEventTimer
                });


            }

Log クラスは、文字列型の getter と setter の集まりです。

そして、log4net 設定を含む app.config ファイル:

 <log4net>
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">

      <bufferSize value="1"/>
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="Data Source=localhost; Initial Catalog=[MyDatabase]; Integrated Security=True;"/>

      <commandText value="INSERT INTO Session ([CreateDate], [SystemUpTime], [EmotivType], [EmotivValue], [EventTimer], [SubEventTimer]) 
                   VALUES (@createdate, @systemuptime, @emotivtype, @emotivvalue, @eventtimer, @subeventtimer)"/>

      <parameter>
        <parameterName value="@createdate"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>

       <parameter>
        <parameterName value="@systemuptime"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

     <parameter>
    <parameterName value="@emotivtype" />
    <dbType value="String" />
    <size value="50" />
    <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%emotivtype" />
  </layout>
  </parameter>

  <parameter>
    <parameterName value="@emotivvalue"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%emotivvalue"/>
    </layout>
  </parameter>

      <parameter>
        <parameterName value="@eventtimer"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

      <parameter>
        <parameterName value="@subeventtimer"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>

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

その結果、%emotivtype と %emotivalue は常にフィールド名を受け取ります。

ID  CreateDate  SystemUpTime    EmotivType  EmotivValue EventTimer  SubEventTimer
13547   17:06:56.787    17:06:56.787    emotivtype  emotivvalue 17:06:56.787    17:06:56.787

これはばかげた、修正可能なもののように思えますが、私はそれを避けます。助言がありますか?ありがとう。

4

1 に答える 1

0

log4netはクラスの処理方法を知らないためLog、単にクラスを呼び出すだけToString()です...2つのオプションがあると思います。

最初のオプション:
データベースのストアドプロシージャで解析する形式で、関心のあるフィールドをクラスに返すようにします。例えば

emotivtype|emotivevalue|other fields...

次に、ストアドプロシージャの単一のパラメータを設定します(データベース内の上記の文字列を解析するために1つ必要です。

<parameter>
    <parameterName value="@emotivvalue"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
       <conversionPattern value="%message"/>
    </layout>
</parameter>

明らかな欠点は、ファイルまたはコンソールで適切な出力を取得できないことです。これを回避する方法(カスタムレイアウトコンバーター)はありますが、これが正しいアプローチかどうかはわかりません。

2番目のオプション:
いわゆるコンテキストプロパティを使用できます(ここに良いチュートリアルがあります)。特に「計算されたコンテキスト値」を見てください。これについて何を書くべきかわかりません...多分それについて特定の質問があれば私はそれらに答えることができます。

于 2012-06-30T10:46:07.600 に答える