带有NLog的Caliburn Micro - 如何使用记录器和记录到XML文件

时间:2011-10-15 09:49:38

标签: wpf xml mef nlog caliburn.micro

您好我尝试使用校准微博的Nlog,我使用本教程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

}

我修改了MEF bootraper:

#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模型类中使用now logger,其次我想知道是否可以使用NLog登录到XML文件。

感谢您的支持

2 个答案:

答案 0 :(得分:0)

要使用记录器,您需要提供一个记录器。您可以通过在构造函数(显式)或属性(隐式)中请求记录器实例来执行此操作,甚至可以请求日志管理器将其提供给您。

以下是您在ViewModel中可以执行的操作:

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

或者,如果您已在使用Caliburn选择的容器中注册了ILog实例,则可以注入ILog实例(通过构造函数或属性)。我使用Castle Windsor,所以注册部分看起来像这样:

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

你可以在构造函数中要求记录器:

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

答案 1 :(得分:0)

我意识到这个问题已经接受了答案,但我想我会提到你的NLog包装器可以写得更好。正如现在实施的那样,如果打开呼叫站点信息的记录(进行记录调用的类/方法),您将无法获得正确的信息。您可以获得包装器调用NLog的呼叫站点,而不是从您调用NLog包装器的位置获取呼叫站点。

请查看我对以下问题的回答,了解编写NLog包装器的正确方法(在保留调用点信息的意义上是正确的。)

How to retain callsite information when wrapping NLog

该问题询问如何使用特定模式为NLog编写包装器(他的Log方法获取NLog记录器,然后调用相应的Info,Warn,Error等方法)。这种模式有点不正统(在每次通话期间获取记录器)。您正在执行的更典型的模式是在构造函数中获取NLog记录器。有关如何在此模式中编写NLog包装器以保留调用点信息的示例,请参阅以下链接:

Nlog Callsite is wrong when wrapper is used

请注意,如果要为log4net编写包装器,则需要非常类似的技术。

祝你好运!