4

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

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

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

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

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

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

我正在使用 SharePoint 2007。

4

4 回答 4

6

最简单的集中化方法可能是简单地记录到数据库,一个好处是多个应用程序和写入数据库比写入同一个日志文件更容易。对于每个应用程序,配置 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”论坛中搜索此文本,您应该会找到正确的帖子。

祝你好运!

于 2011-02-09T17:54:59.237 回答
3

您还可以仅利用 SharePoint 中现有的日志记录基础结构并写入 ULS 日志。这样就可以使用ULS 日志查看器在完整的上下文中查看您的日志信息。对于 SharePoint 2007,请参阅此博客如何写入 ULS 日志: SharePoint 跟踪日志和统一日志记录服务 (ULS)

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

于 2011-02-09T06:24:38.710 回答
1

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

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

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

于 2011-05-27T07:18:14.417 回答
0

我觉得我们在做同一个项目!由 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 的目标包装器。

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

于 2015-12-17T03:47:06.503 回答