您好我尝试使用校准微博的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文件。
感谢您的支持
答案 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编写包装器,则需要非常类似的技术。
祝你好运!