65.9K
CodeProject 正在变化。 阅读更多。
Home

日志记录:如何使用 NLog 3 (或 2.1) 与 Growl 互动

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (5投票s)

2014年6月15日

CPOL

7分钟阅读

viewsIcon

20372

downloadIcon

839

这将让您在短时间内将 NLog 的日志记录到 Growl。

演示 -> 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 日:初次发布。

 

© . All rights reserved.