2013-04-04 3 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. –

+0

Мне нужно быть свободным, когда дело доходит до позиции протрети в выходе. Поэтому включение метода ToString не просто плохой дизайн, но и не решит мою проблему. – Jaster

+0

Возможный дубликат [Как настроить log4net так, чтобы свойства объекта могли быть сопоставлены с выходом журнала?] (Http://stackoverflow.com/questions/1041751/how-do-i-configure-log4net-such- что-свойства-оф-объекта-может-быть отображенные к-й) – Joe

ответ

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)); 
    } 
} 

Config выглядит следующим образом:

<layout type="MyAssembly.MyNamespace.ReflectionLayoutPattern, MyAssembly"> 
    <conversionPattern value="[%item{Id}]&#9;%message%newline" /> 
</layout> 
2

Вы можете использовать класс CustomXmlLayout, который происходит от XmlLayoutBase и переопределяет метод 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.

Смежные вопросы