Caliburn Micro с NLog - как использовать регистратор и войти в файл XML - PullRequest
1 голос
/ 15 октября 2011

Привет, я пытаюсь использовать Nlog в с caliburn micro, у меня есть этот урок http://buksbaum.us/2010/08/08/how-to-do-logging-with-caliburn-micro/.

Сначала я определил класс Nloagger, вот оно:

public class NLogLogger : ILog 
{ 
    #region Fields 

    private readonly NLog.Logger _innerLogger; 

    #endregion 

    #region Constructors 

    public NLogLogger(Type type) 
    { 
        _innerLogger = NLog.LogManager.GetLogger(type.Name); 
    } 
    #endregion 

   #region ILog Members 

    public void Error(Exception exception) 
    { 
        _innerLogger.ErrorException(exception.Message, exception); 
    } 

    public void Info(string format, params object[] args) 
    { 
        _innerLogger.Info(format, args); 
    } 

    public void Warn(string format, params object[] args) 
    { 
        _innerLogger.Warn(format, args); 
    } 
    #endregion

}

Что я модифицировал MEFbootraper:

#region Constructors

    public MefBootStrapper()
        : base()
    {
        _msgBox = new MessageBoxes();
        _doHandle = true;
    }

    static MefBootStrapper()
    {
        LogManager.GetLog = type => new NLogLogger(type);
    }


#endregion

и последнее изменение app.config

<?xml version="1.0"?>

<configuration>

  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  </configSections>

  <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets>
      <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>

    <rules>
      <logger name="*" minlevel="Error" writeTo="logfile" />
    </rules>
  </nlog>


</configuration>

Это действительно глупо для меня, но я не знаю, как сейчас использовать регистратор в классе модели View, а во-вторых, я хотел бычтобы узнать, возможно ли войти с NLog в XML-файлы.

Спасибо за поддержку

Ответы [ 2 ]

0 голосов
/ 17 октября 2011

Я понимаю, что на этот вопрос был принят ответ, но я подумал, что скажу, что ваша оболочка NLog могла бы быть написана лучше. Поскольку это реализовано прямо сейчас, вы не получите правильную информацию, если включите регистрацию информации о месте вызова (класс / метод, выполняющий вызов регистрации). Вместо получения места вызова, откуда вы вызываете свою оболочку NLog, вы получите место вызова, где оболочка вызывает NLog.

Посмотрите на мой ответ на следующий вопрос, чтобы узнать, как правильно написать оболочку NLog (верно в том смысле, что информация о месте вызова сохраняется).

Как сохранить информацию о месте вызова при упаковке NLog

Вопрос состоит в том, как написать оболочку для NLog с определенным шаблоном (его метод Log получает регистратор NLog, а затем вызывает соответствующий метод Info, Warn, Error и т. Д.). Этот шаблон немного неортодоксален (получение регистратора при каждом вызове). Более типичный шаблон, который вы делаете, заключается в получении регистратора NLog в вашем конструкторе. Смотрите следующую ссылку для примера того, как написать оболочку NLog в этом шаблоне, которая сохраняет информацию о месте вызова:

Nlog Callsite неверен при использовании оболочки

Обратите внимание, что очень похожая техника необходима, если вы хотите написать оболочку для log4net.

Удачи!

0 голосов
/ 15 октября 2011

Чтобы использовать регистратор, вам нужно попросить его.Вы можете сделать это, запросив экземпляр регистратора в конструкторе (явном) или свойстве (неявном), или даже попросить менеджера журналов передать его вам.

Вот что вы можете сделать в своей ViewModel:

public void MyViewModel 
{
    public MyViewModel()
    {
        Caliburn.Core.Logging.ILog logger = Caliburn.Core.Logging.LogManager.GetLog(typeof(MyViewModel));
        logger.Info("Something Happened");
    }
}

В качестве альтернативы вы можете внедрить экземпляр ILog (через конструктор или свойство), если вы уже зарегистрировали его в контейнере, который вы выбрали в Caliburn.Я использую Castle Windsor, поэтому часть регистрации будет выглядеть так:

container.Register(Component.For<ILog>().ImplementedBy<NLogLogger>().LifeStyle.Transient);

И вы можете просто запросить регистратор в вашем конструкторе:

public void MyViewModel 
{
    public MyViewModel(ILog logger)
    {
        logger.Info("Something Happened");
    }
}
...