日志记录:如何使用 NLog 3 (或 2.1) 与 Growl 互动
这将让您在短时间内将 NLog 的日志记录到 Growl。
- 下载演示 - 29 KB
- 下载演示 - 445 KB
- 下载 NLog_config_and_schema.zip - 11.9 KB
- 下载 nlog_3.0.0.zip - 140.3 KB
- 下载 growl_adapter_for_nlog_3.zip - 58.4 KB
演示 -> Visual Studio 解决方案 (包含 (445kb) 和不包含 (29kb) 可执行文件)。
"growl adapter for nlog 3.zip" -> 您需要这三个文件才能将 NLog 连接到 Growl。
"nlog 3.0.0.zip" -> NLog 的 dll,您可以在此处、NuGet 或其主页上获取。
"NLog config and schema.zip" -> 您可以下载并添加到您的项目中 (节省一些时间),或者手动创建配置文件 (您需要这个),并从 NuGet 获取架构 (可选,但推荐)。
引言
在本文中,我将引导您完成安装、配置以及如何成功地将消息从 NLog 记录到 Growl。
如果您之前没有接触过日志记录,我强烈建议您先看看我的另一篇文章。
如果您不知道 Growl 是什么,这里简要介绍一下 Growl (摘自 Growl 主页)
-
Growl for Windows 是 Mac OS X 的通知系统 Growl 的 Windows 兼容版本。
-
简而言之,Growl 会在事件发生时通知您。文件下载完成、朋友上线、新邮件到达 - Growl 可以在任何事件发生时通过细微的通知告知您。其余时间,Growl 不会打扰您。
背景
本文之所以在此,是因为我在网上找到的方法不起作用。最初的想法和示例 (据我所知) 归功于 Ryan Farly,可以在以下文章中找到:
尝试使用以上链接和教程,让我陷入了沮丧的境地,因为似乎没有一个起作用。原因是,在撰写以上内容时,NLog 使用的是 .NET 2 框架。
Growl 也使用 .NET 2 框架编译,因此用于目标的库也使用相同的目标进行编译。
尽管我非常喜欢 NLog,但他们的网页声称 NLog 3 即将发布 (2013-12-14),而我在五月底左右还在为此苦苦挣扎。NuGet 包管理器安装了 NLog 3,但没有提示我。我以为我用的是 2.1。在最新的 NLog 中,.NET 2.0 的支持已被删除,因此在我尝试记录时,一切都无法工作。(似乎在一周前 NLog 网站更新了,宣布 NLog 3 已发布,但我无法在其下载页面找到下载。请转到 NuGet,或从我上面的文件中获取)。
因此,为了节省大家的时间,这里是您需要的更新文件,以及一个关于如何在不到 10 分钟内完成此设置的教程。
使用代码
如果您对 NLog 了如指掌,只想了解使其工作的步骤,请跳转到 本节,否则,请继续阅读。
第一步:准备您的系统
1.1 下载并安装 Growl。
您可以在其 主页 上找到安装程序。确保 Growl 正在运行,如果您打算将其用作日志记录的目标。
1.2 获取 NLog
可以从其下载页面、上面的 zip 文件或 NuGet 获取。
第二步:在 VS 中创建控制台项目
没什么特别的,它只需要作为一个起点。以下内容足够了:
using System;
namespace GrowlDemo
{
class Program
{
static void Main(string[] args)
{
Console.Out.WriteLine("I feel like Growling");
Console.Out.WriteLine("Hit Enter to quit");
Console.In.ReadLine();
}
}
}
构建并运行此程序,以查看一切是否正常工作。您应该在屏幕上看到文本。
第三步:为我们的项目添加基本日志记录
添加对 NLog.dll 的引用 (如果您通过 NuGet 安装了它,则已完成)。
将 Nlog config and schema.zip 中的文件添加到您的项目中。它应该看起来像这样:
NLog 架构 (NLog.xsd) 将为您的 NLog.config 启用智能感知,后者将包含目标和日志记录规则。注意:这也可以通过编程方式完成,并且是我将在不久的将来撰写的另一篇文章的一部分。
您的 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="console"
xsi:type="ColoredConsole"
layout="${shortdate} ${level} ${message}"
/>
<rules>
<logger name="*"
minlevel="Trace"
writeTo="console" />
</rules>
</nlog>
这目前只会将日志写入彩色控制台。修改您的 main 方法,使其看起来像这样:
static void Main(string[] args)
{
Console.Out.WriteLine("Growl");
Logger logger = LogManager.GetCurrentClassLogger();
logger.Trace("A trace");
logger.Debug("A trace");
logger.Info("A Info");
logger.Warn("A Warn");
logger.Error("A Error");
logger.Fatal("A Fatal");
// Wait for enter to quit
Console.Out.WriteLine("Hit Enter to quit");
Console.In.ReadLine();
}
这将添加一些我们可以轻松看到的日志。
注意:如果您在此刻尝试运行它,它将不起作用。原因在于 NLog 的配置文件默认设置为“不复制”。选择配置文件,然后在属性中将“复制到输出目录”更改为“始终复制”。截图如下:
如果构建并运行您的项目,您应该会看到类似以下的输出:
第四步:Growling
实现 growling 最简单的方法是将目标添加到 NLog 配置文件,将 dll 添加到输出目录,然后一切就绪。
因此,首先,修改您的 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">
<extensions>
<add assembly="NLog.Targets.GrowlNotify" />
</extensions>
<targets>
<target name="console"
xsi:type="ColoredConsole"
layout="${shortdate} ${level} ${message}"
/>
<target name="growl"
xsi:type="GrowlNotify"
password=""
host=""
port="23053"
/>
</targets>
<rules>
<logger name="*"
minlevel="Trace"
writeTo="console" />
<logger name="*"
minlevel="Trace"
writeTo="growl"/>
</rules>
</nlog>
基本上,我们所做的就是为 logger 添加了一个目标,并为该目标设置了一条规则。
由于该目标不是常规目标的一部分,我们还通过导入程序集来包含 NLog.Targets.GrowlNotify.dll。
其次,将上面 "growl adapter for nlog 3.zip" 中的 dll 文件复制到您的程序目录 (默认情况下为 \bin\debug)。注意:如果您跳过此步骤,将看不到任何日志记录。稍后我将讨论一些其他选项来实现相同的功能。
第三,编译并运行您的程序,您也应该会看到类似以下的输出:
恭喜您,您已成功将日志从 NLog 记录到 Growl。从此,天空才是极限,一切都取决于您的想象力。
如果您遇到任何问题,请跳转到 陷阱 部分。
最简短的、仅基础的 NLog 到 Growl 的配置步骤
1. 您需要在项目中引用 NLog。
2. 您需要将 "growl adapter for nlog 3.zip" 中的 3 个 dll 文件放在输出目录中。
3. 您需要通过配置文件或以编程方式创建目标。
常见陷阱
以下是一些可以为您节省数小时排查问题的时间的建议:
1. 缺少 dll 文件
如果您没有将适配器 zip 文件中的 3 个文件复制到输出目录,或者您的配置文件未设置为“始终复制”,或者您的 NLog dll 未被引用……您将看不到任何日志记录。
2. Growl 目标配置错误
如果您的 Growl 目标配置中缺少以下 port="23053"
,您将看不到任何日志记录。
3. 多个 NLog.config 文件
如果您使用多个配置文件,只有一个会最终进入输出目录。如果它是正确的那个,您就很幸运了,您将看到日志记录,否则……您懂的……
4. 多个 NLog.xsd 文件
拥有多个此类文件会引发恼人的警告并破坏智能感知。确保只引用一个,或者转到菜单 -> XML -> 架构,并确保只选择了一个。
替代方案
使用 Ryan 的项目
您可以在 Ryan Farley 的 Github 页面 这里 获取原始项目。
获取后,您可以将其添加到您的项目中,然后直接引用它,或者进行一些修改。无论您做什么,请确保它不是以 .NET 2.0 项目编译的 :)
以编程方式配置目标
您还可以通过代码而不是配置文件来定义目标。代码应如下所示:
// 1. create configuration object
var config = new LoggingConfiguration();
// 2. create targets and add them to the config
var console_target = new ColoredConsoleTarget();
config.AddTarget("console", console_target);
var growl_target = new NLog.Targets.GrowlNotify();
config.AddTarget("growl", growl_target);
// 3. set target propeties
console_target.Layout = "${date:format=HH\\:MM\\:ss.fff} | ${level:uppercase=true}\t| ${logger} | ${message}";
growl_target.Port = 23053;
// 4. define rules
var rule_1 = new LoggingRule("*", LogLevel.Trace, console_target);
config.LoggingRules.Add(rule_1);
var rule_2 = new LoggingRule("Test.*", LogLevel.Trace, growl_target);
config.LoggingRules.Add(rule_2);
// 5. activate the configuration
LogManager.Configuration = config;
这将实现与上述配置文件相同的功能。它有利有弊,但这属于下一篇文章的内容,如果您对此主题感兴趣,请继续关注。
关注点
如您所见,有很多方法可以解决问题。请注意常见的 陷阱,并在事情不顺利时准备好一只 橡皮鸭 来帮助您进行调试。
有关日志记录和不同级别的更多信息,请参阅我的 NLog 文章,或此 Wiki 页面。
如果您觉得本文有帮助,请为文章投票、留言,并随时回复本文
历史
- 2014 年 6 月 15 日:初次发布。