将NLog target设置为RichTextBox的注意事项,NLog版本4.2.1
NLog是一个功能强大的logging工具,它可以很方便地定义不同的target将日志输出到不同的位置。我在使用中需要将日志输出到窗口控件中,在网上搜了一下,有几篇貌似是我需要的文章,但都是几年前的,NLog版本是2.0的,先试一试能不能用。按照文中所写,在C#工程中添加Nlog.config文件,如下:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="control"
xsi:type="RichTextBox"
controlName="txtLogger"
formName="P5Form"
useDefaultRowColoringRules="true"
layout="${longdate}-${level} ${message} ${onexception:||${exception}||${stacktrace}}"/>
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="control" />
</rules>
</nlog>
在工程中添加NLog.dll,再在代码中加入:
protected static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
...
logger.Debug("这是一条Debug信息.");
...
OK啦,运行程序,期待正确的结果^_^。
但是控件中并没有任何输出啊!一定是什么地方出问题了。
在GitHub上找到源码NLog/NLog,在examples/targets/Configuration File/RichTextBox/Simple/中找到NLog.config,打开发现配置文件并没有问题。
难道是我下载的NLog.dll有问题吗?在项目“引用”中打开NLog,发现NLog.Targets中确实没有RichTextBoxTarget。再搜索RichTextBoxTarget,找到NLog.Windows.Forms,这里有与Windows Form相关的target。下载源代码,编译得到NLog.Windows.Forms.dll,加入项目。其它部分都不用改动,直接运行程序,结果还是不正常!
可是库文件确实没问题了啊!再找找问题。发现有人问过相同的问题,这就好办啦,点进去一看,原来是
protected static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
的问题。在构造logger对象时,Form.Name=”P5Form”和RichTextBox.Name=”txtLogger”必须存在且创建完毕。因此将代码改为:
protected static NLog.Logger logger = null;
...
public P5Form_Load(object sender, EventArgs e)
{
if (logger == null)
logger = NLog.LogManager.GetCurrentClassLogger();
}
继续编译运行程序,这次结果终于正常了。
总结
- 由于NLog版本发生变化,其代码结构也有变化。项目中必须同时添加NLog.dll和NLog.Windows.Forms.dll。
- NLog.config中target必须设置正确,Form名称、RichTextBox名称必须与配置文件中一致。
- 项目代码中必须保证logger对象在窗体、控件创建完毕后才能构造。即:
protected static NLog.Logger logger = null;
...
public XXForm_Load(object sender, EventArgs e)
{
if (logger == null)
logger = NLog.LogManager.GetCurrentClassLogger();
}