如何通过NLog实现最佳的日志集中记录方式?

4
我被分配了一个项目,其中包含大量基于SharePoint的代码,但代码质量较差。该项目由约15个子项目组成,其中一些是Windows服务,一些是Web服务,一些是在SharePoint内运行的Web应用程序,还有一些是Web部件和控制台应用程序。它们都在同一台服务器上运行并相互调用。
生产环境中已经存在许多问题,但很难追踪。原始开发人员可能是Salinger或Pokémon系列的粉丝,因为他不知疲倦地努力捕捉所有异常。不幸的是,它们中的任何一个都没有报告或记录。
我的当前任务是将日志记录引入整个项目,以便找到现在看不见的异常,跟踪错综复杂的调用,并至少拥有一些堆栈跟踪。我决定使用 NLog,因为它活跃而酷炫,而 log4net 完全可以胜任,但对我来说略显普通。
因为组件之间耦合度高,我希望将日志记录集中在一个文件中,以便相关错误不会散落在硬盘上。因此,我希望有两个或三个不同的日志文件,每个文件中大约同时写入五个或更多的项目。
最佳配置NLog来集中日志记录的方式是什么?我应该为每个项目创建一个配置文件,还是相关项目共享它们?我应该将配置文件放置在哪里以从SharePoint webpart中进行日志记录?我是否会遇到任何权限问题?
我正在使用SharePoint 2007。

SharePoint 2007 还是 SharePoint 2010? - Lars Fastrup
4个回答

7

最简单的集中日志方式可能是将日志记录到数据库中,其中一个好处是多个应用程序可以更轻松地写入数据库而不是同一个日志文件。对于每个应用程序,配置NLog以将日志记录到Database目标,使用相同的Database目标配置参数。您的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进行此操作,我不熟悉,因此无法评论您可能遇到的任何配置或权限问题。下面是一个链接,其中讨论了如何在SharePoint环境中使用NLog:http://nlog-forum.1685105.n2.nabble.com/Is-anyone-using-NLog-with-SharePoint-td2171451.html。该链接似乎将您带到了NLog论坛的顶部,而不是特定的帖子。请在论坛中搜索“是否有人在SharePoint中使用NLog”,然后您应该会找到正确的帖子。祝你好运!

谢谢回复。暂时我会使用文本日志,但我也喜欢数据库方法。您的答案展示了在NLog中实现它是多么简单,因此我将其标记为正确。 - Dan Abramov

3

谢谢您的建议。然而,一些组件在 SharePoint 上下文之外运行,并且无论如何,SharePoint 日志都包含了与我的应用程序无关的大量信息。这就是为什么我想要一个单独的日志。 - Dan Abramov

1

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

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

我更喜欢简单的纯文本日志文件。虽然如果您的代码中没有太多的“日志行”实现,将日志记录到数据库中也很好用。


0

我感觉我们正在处理同一个项目!这个项目包括网站项目、核心dll项目、控制台应用程序、服务等多个项目。不幸的是,我不像你一样在SharePoint上工作,但我可以描述一下我如何尝试将我们的日志集中化。

我们有一个核心的.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的目标包装器。

希望有所帮助,我很好奇是否有人对我正在做的事情有建议或意见!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接