0

アプリケーションからイベント/情報をログに記録するために log4net を使用しています。IReader少なくとも 4 つのクラスによって実装されているインターフェイスがあり、それは成長する可能性があります。各クラスにはReadBuffer()、読み取りが失敗した場合にエラーをログに記録するメソッドがあります。以下は、1 つのクラスのメソッド定義です。

public class IPortM350Connection : IReader
{

    public void ReadBuffer()
    {
        try
        {
            this.AddToLog(iqBeaconLogType.Info, string.Format("Reader# {0} start reading.", SerialNumber));
            while (IsConnected)
            {
                if (IportM350Obj != null && IportM350Obj.DataStream.IsOpen)
                {
                    var data = IportM350Obj.GetBeaconTags();
                    var rampTagList = Utility.Identec350TagToTag(data);
                    if (rampTagList != null && rampTagList.Any())
                    {
                        var e = new RampTagReadEventArg(rampTagList);
                        // trigger Successful Tag read event
                        ReadMessage(this, e);
                    }
                }
            }
        }
        catch (ReaderTimeoutException ex)
        {
            this.AddToLog(iqBeaconLogType.Fatal, string.Format("Reader# {0} failed reading.", SerialNumber));

        }

    }
}

AddToLog 拡張メソッドは、以下に示すログの作成を担当します。

    public static void AddToLog(this object logObject, iqBeaconLogType logType, string message)
    {
        ILog log = LogManager.GetLogger(logObject.GetType());

        var msg = string.Format("Event occured in : {0} at time {1}. Event Log : {2}",
                        logObject.GetType().ToString(),DateTime.Now.ToString(), message);
        log.Fatal(msg);
    }

このメソッドは、以下のようにクラスを読み取るように構成ファイルをセットアップすると正常に機能します。

<logger name="iqBeaconv7_1.ReaderLayer.Connection.IPortM350Connection" additivity="False">
  <level value="ALL"/>
  <appender-ref ref="RollingFileCompositeAppenderForIPort350Connection"/>
</logger>

ただし、 IReader インターフェイスをロガーに渡すことができれば、すべてのクラスを同じファイルでログに記録できると思います。に置き換えIPortM350Connectionても、ログ エントリは取得されませんIReader。インターフェースの設定ファイルを書いた人はいますか、それともこれを克服する方法を知りましたか?

4

1 に答える 1

3

メソッドAddToLogは、派生クラス ( ) の名前と同じ名前のロガーを作成していlogObject.GetType()ます。すべての派生クラスに共通のロガーを使用することができます。その名前はハードワイヤードであるか、インターフェイスの名前です ( IReader)。

あなたが何を達成しようとしているのか完全にはわかりませんが、 AddToLog メソッドを次のように変更してみてください。

public static void AddToLog(this IReader logObject, iqBeaconLogType logType, string message)
{
    ILog log = LogManager.GetLogger(typeof(IReader));
    ...
}

および log4net 構成を次のようにします。

<logger name="iqBeaconv7_1.ReaderLayer.Connection.IReader" additivity="False">
    ...
</logger>
于 2014-10-17T06:54:09.057 に答える