5

次のクラスを使用して、log4net を使用してメッセージを出力しました。

public class Message
{
    public String Text { get; set; }
    public int Id { get; set; }
    public override string ToString()
    {
        return Text;
    }
}

私は を使用Logger.Info(MessageInstance)しているので、log4net はToStringメソッドを呼び出してメッセージを出力するだけです。メッセージ オブジェクトのプロパティもログに記録したいIdのですが、これを達成する方法がわかりません。

私の変換パターンは次のようになります。

<conversionPattern value="%date %-5level %message%newline" />

追加しようとしまし%message{Id}たが、メッセージ全体が 2 回出力されるだけです。

助言がありますか?

4

2 に答える 2

3

メッセージオブジェクトのプロパティを読み取ることができるカスタムパターンを作成しました。

public class ReflectionReader : PatternLayoutConverter
{
    public ReflectionReader()
    {
        _getValue = GetValueFirstTime;
    }

    protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        writer.Write(_getValue(loggingEvent.MessageObject));
    }

    private Func<object, String> _getValue;
    private string GetValueFirstTime(object source)
    {
        _targetProperty = source.GetType().GetProperty(Option);
        if (_targetProperty == null)
        {
            _getValue = x => "<NULL>";
        }
        else
        {
            _getValue = x => String.Format("{0}", _targetProperty.GetValue(x, null));
        }
        return _getValue(source);
    }

    private PropertyInfo _targetProperty;
}

これと組み合わせる:

public class ReflectionLayoutPattern : PatternLayout
{
    public ReflectionLayoutPattern()
    {
        this.AddConverter("item", typeof(ReflectionReader));
    }
}

構成は次のようになります。

<layout type="MyAssembly.MyNamespace.ReflectionLayoutPattern, MyAssembly">
  <conversionPattern value="[%item{Id}]&#9;%message%newline" />
</layout>
于 2013-04-04T11:47:08.923 に答える