【问题标题】:Caliburn Micro with NLog - how to use logger and log to XML file带有 NLog 的 Caliburn Micro - 如何使用记录器和记录到 XML 文件
【发布时间】:2011-10-15 09:49:38
【问题描述】:

您好,我尝试在 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 引导程序:

#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 文件。

感谢您的支持

【问题讨论】:

    标签: wpf xml mef nlog caliburn.micro


    【解决方案1】:

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

    您可以在 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 实例(通过构造函数或属性)。我用的是温莎城堡,所以注册部分是这样的:

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

    你可以在你的构造函数中请求一个记录器:

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

    【讨论】:

      【解决方案2】:

      我意识到这个问题的答案已被接受,但我想我会提到你的 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 编写包装器,则需要非常相似的技术。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        相关资源
        最近更新 更多