【问题标题】:What is the best way to centralize logging with NLog?使用 NLog 集中日志记录的最佳方法是什么?
【发布时间】:2011-06-23 13:31:01
【问题描述】:

我被分配了一个项目,其中包含许多基于 SharePoint 的编写不佳的代码。

它由大约 15 个子项目组成,其中一些是 Windows 服务、一些 Web 服务、一些在 SharePoint 内部运行的 Web 应用程序、一些是 Webpart 甚至是控制台应用程序。它们都在同一台服务器上运行并相互调用。

生产中已经存在很多问题,但很难追查。
从他孜孜不倦地捕捉所有例外情况来看,最初的开发者一定是塞林格或神奇宝贝系列的粉丝。不幸的是,他们都没有得到报告或记录。

我当前的任务是在整个项目中引入日志记录,这样我就可以找到现在不可见的异常,跟踪复杂的重复调用并至少有一些堆栈跟踪。我决定选择NLog,因为它既活跃又酷,而不是log4net,它非常好,但有点不合我的口味。

由于组件紧密耦合,我想将日志集中在一个文件中,这样相关错误就不会分散在硬盘上。因此,我希望有两个或三个不同的日志文件,其中有五个或更多项目或多或少地同时写入每个项目。

配置 NLog 以集中日志记录的最佳方式是什么?我应该为每个项目都有一个配置文件,还是应该相关项目共享它们?我应该将配置文件放在哪里以从 SharePoint Webpart 进行日志记录?我会遇到任何权限问题吗?

我正在使用 SharePoint 2007。

【问题讨论】:

  • SharePoint 2007 还是 SharePoint 2010?

标签: sharepoint logging configuration nlog nlog-configuration


【解决方案1】:

我觉得我们在做同一个项目!由 web 项目、核心 dll 项目、控制台应用程序、服务等组成的多个项目。不幸的是,我不像你那样在 sharepoint 工作,但我可以描述我是如何尝试集中我们的日志记录的。

我们有 1 个核心 .Net 框架项目。这是我放置日志包装类的地方。该项目还包含 nlog dll 和 nlog 配置文件。在这个核心项目文件中,你可以添加它,当你构建依赖于这个核心项目的项目时,它会自动移动配置。

<None Include="Logging\NLog.config">
  <link>NLog.config</link>
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>

我们发现一些不编译 dll 的 web 项目不会自动拉入配置文件,因此我们将把它留给构建过程。这有助于集中我们的日志记录,因此您只需管理一个配置即可。

另外请记住,当您为每个类创建一个记录器时,日志名称中应该包含命名空间,因此如果您想为特定项目设置不同的设置,您可以创建基于命名空间过滤的特定目标。

至于集中记录日志的最终位置,我们选择使用文件目标并指定完整路径。这是因为在我们的服务器上,应用程序从 C:\ 运行,但我们有更大的 D:\ 可以存储日志。在我们的生产服务器中,我们也有多个服务器,因此我们使用 splunk 来聚合我们所有的日志。

如果 splunk 是不可能的,并且您使用的是分布式系统,那么如上所述,数据库听起来是个好主意。如果你不想建立一个 sql 实例,也有 mongo db 的目标包装器。

希望对您有所帮助,我很好奇是否有人对我的工作方式有任何建议或意见!

【讨论】:

    【解决方案2】:

    我个人将异常记录到事件记录器中。我使用 NLog 来记录详细信息、调试信息或跟踪。

    由于 NLog 可以轻松打开和关闭,我只在调试或需要检查生产中的异常时才激活它。我从来都不是 .NET 中默认跟踪功能的忠实粉丝。

    我更喜欢简单的纯文本日志文件。尽管如果您的代码中没有实现太多“日志行”,那么记录到数据库会非常有用。

    【讨论】:

      【解决方案3】:

      最简单的集中化方法可能是简单地记录到数据库,一个好处是多个应用程序和写入数据库比写入同一个日志文件更容易。对于每个应用程序,配置 NLog 以记录到数据库目标,对每个应用程序使用相同的数据库目标配置参数。您的 NLog.config 文件可能如下所示:

      <?xml version="1.0" encoding="utf-8" ?>
      <!-- 
        This file needs to be put in the application directory. Make sure to set 
        'Copy to Output Directory' option in Visual Studio.
        -->
      <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            autoReload="true" 
            internalLogLevel="Debug"
            internalLogFile="nlog_log.log">
      
      
        <targets async="true">
          <target name="sqlexpress" xsi:type="Database">
            <connectionString>
              Data Source=.\SQLEXPRESS;Initial Catalog=LoggingDB;Integrated Security=True;
            </connectionString>
            <commandText>
              insert into LogTable(DateTime,Logger,LogLevel,Message,ProcessId,ManagedThreadId) values (@DateTime,@Logger,@LogLevel,@Message,@ProcessId,@ManagedThreadId);
            </commandText>
            <parameter name="@DateTime" layout="${date:format=yyyy\-MM\-dd HH\:mm\:ss.fff}"/>
            <parameter name="@Logger" layout="${logger}"/>
            <parameter name="@LogLevel" layout="${level}"/>
            <parameter name="@Message" layout="${message}"/>
          </target>
      
          </target>
        </targets>
        <rules>
          <logger name="*" minlevel="Trace" writeTo="sqlexpress" />
        </rules>
      </nlog>
      

      除了(或代替)记录到数据库之外,您当然可以记录到文件。

      我不熟悉从 SharePoint 执行此操作,因此我无法评论您可能遇到的任何配置或权限问题。

      这是我找到的一个链接,其中讨论了如何让 NLog 在 SharePoint 环境中工作:

      http://nlog-forum.1685105.n2.nabble.com/Is-anyone-using-NLog-with-SharePoint-td2171451.html

      该链接似乎将您置于 NLog 论坛的顶部,而不是特定的帖子。在“有人在 SharePoint 中使用 NLog”论坛中搜索此文本,您应该会找到正确的帖子。

      祝你好运!

      【讨论】:

      • 感谢您的回答。有一段时间,我会使用文本日志,但我也喜欢数据库方法。您的回答显示了它在 NLog 中的简单程度,因此我将其标记为正确。
      【解决方案4】:

      您还可以仅利用 SharePoint 中现有的日志记录基础架构并写入 ULS 日志。这样,您可以使用ULS log viewer 在完整的上下文中查看您的日志信息。对于 SharePoint 2007,请参阅此博客如何写入 ULS 日志: SharePoint Trace Logs and the Unified Logging Service (ULS)

      在 SharePoint 2010 中,通过改进 SPDiagnosticsService 类变得更加容易,您可以在其中使用新的 WriteTrace 方法。

      【讨论】:

      • 感谢您的建议。但是,某些组件超出了 SharePoint 上下文,而且无论如何,SharePoint 日志都非常臃肿,其中包含与我的应用程序无关的信息。这就是为什么我想要一个单独的日志。
      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      相关资源
      最近更新 更多