2013-04-04 96 views
4

我用下面的類使用log4net的打印出消息: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}但也只是打印整個消息的兩倍。

有什麼建議嗎?

+0

是否需要在一個特定的格式?如果沒有,那麼你可以修改你的ToString()方法來包含Id。 – 2013-04-04 09:05:46

+0

當談到輸出中的特性位置時,我需要自由。所以將它放入ToString方法不僅僅是糟糕的設計,而且也不能解決我的問題。 – Jaster 2013-04-04 09:14:04

+0

可能重複[如何配置log4net,使對象的屬性可以映射到日誌輸出?](http://stackoverflow.com/questions/1041751/how-do-i-configure-log4net-such-即 - 屬性 - 的 - 一個對象可任意被映射到th)的 – Joe 2013-04-04 11:46:11

回答

2

我剛寫了一個自定義模式,它允許讀取消息對象的屬性。

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> 
2

您可以使用派生自XmlLayoutBase的CustomXmlLayout類並重寫FormatXml方法。此方法將一個LoggingEvent對象作爲參數,該對象將包含傳遞給日誌方法的MessageObject。

public class SpecialXmlLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent) 
    { 
     Message message = loggingEvent.MessageObject as Message; 
     writer.WriteStartElement("LoggingEvent"); 
     writer.WriteElementString("Message", GetMessage(message)); 
     // ... write other things 
     writer.WriteEndElement(); 
    } 
} 

在GetMessaage方法中,根據消息創建字符串。

然後在log4net的配置使用這個佈局類:

<log4net> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <applicationName value="My Application" /> 
     <layout type="Namespace.SpecialXmlLayout"> 
     </layout> 
     <filter type="log4net.Filter.LevelRangeFilter"> 
     <param name="LevelMin" value="ERROR" /> 
     <param name="LevelMax" value="FATAL" /> 
     </filter> 
    </appender> 
</log4net> 

這是想法。有關更具體的細節,您將需要查閱log4Net SDK文檔。