我被分配了一个项目,其中包含大量基于SharePoint的编写不良的代码。
它包含大约15个子项目,其中一些是Windows服务,一些是Web服务,一些是在SharePoint内部运行的Web应用程序,一些是webparts甚至是控制台应用程序。它们都运行在同一台服务器上并互相通话。
生产中已经存在很多问题,但很难追查 最初的开发者必须是塞林格或神奇宝贝系列的粉丝,因为他不遗余力地捕捉所有例外情况。不幸的是,它们都没有被报告或记录过。
我目前的任务是将日志记录引入整个项目,这样我就可以找到现在看不见的异常,跟随纠结的重复调用,至少有一些堆栈跟踪。我决定和NLog一起看,它看起来很活跃,很酷,而不是log4net,这完全没问题,但有点不像我的口味。
由于组件紧密耦合,我希望将日志记录集中在一个文件中,因此相关错误不会分散在硬盘驱动器上。因此,我希望有两个或三个不同的日志文件,其中有五个或更多项目或多或少同时写入每个项目。
配置NLog以集中日志记录的最佳方法是什么?我是否应该为每个项目配置一个配置文件,或者相关项目是否应该共享它们?我应该在哪里将配置文件从SharePoint webparts中记录下来?我是否会面临任何许可问题?
我正在使用SharePoint 2007。
答案 0 :(得分: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论坛的顶部,而不是特定的帖子。在论坛“是否有人使用NLog with SharePoint”中搜索此文本,您应找到合适的帖子。
祝你好运!答案 1 :(得分:3)
您还可以利用SharePoint中的现有日志记录基础结构并写入ULS日志。这样,您可以使用ULS log viewer在完整的上下文中查看您的日志信息。对于SharePoint 2007,请参阅此博客如何写入ULS日志: SharePoint Trace Logs and the Unified Logging Service (ULS)
使用SharePoint 2010,通过对SPDiagnosticsService类的改进,您可以更轻松地使用新的WriteTrace方法。
答案 2 :(得分:1)
我个人将事件记录器的异常记录下来。我使用NLog记录详细信息,调试信息或跟踪。
由于NLog可以轻松打开和关闭,因此我只在调试时或在需要检查生产中的异常时激活它。我从来不是.NET中默认跟踪功能的忠实粉丝。
我更喜欢简单的纯文本日志文件。虽然如果您的代码中没有实现太多“日志行”,但记录到数据库的效果很好。
答案 3 :(得分:0)
我觉得我们正在开展同一个项目!多个项目包括web项目,核心dll项目,控制台应用程序,服务等。不幸的是,我不像你一样在sharepoint工作,但我可以描述我是如何集中我们的日志记录。
我们有一个核心.Net框架项目。这是我放置日志的包装类的地方。该项目还包含nlog dll和nlog配置文件。在这个核心项目文件中,您可以添加此文件,在您构建依赖于此核心项目的项目时自动移动配置。
<None Include="Logging\NLog.config">
<link>NLog.config</link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
我们发现一些不编译dll的网络项目不会自动提取配置文件,因此我们将其留给构建过程。这有助于集中我们的日志记录,因此您只需管理所有日志记录。
另外请记住,当您为每个类创建一个记录器时,日志名称中应该包含命名空间,因此如果您需要为特定项目设置不同的设置,则可以根据命名空间设置特定目标。
至于集中日志最终的位置,我们选择使用文件目标并指定完整路径。这是因为在我们的服务器上,应用程序运行的是C:\但是我们有更大的D:\可以存储日志。在我们的生产服务器中,我们还有多个服务器,因此我们使用splunk来聚合所有日志。
如果splunk无法解决,而且您使用的是分布式系统,那么数据库听起来就像上面建议的那样好。如果你不想站起来一个sql实例,那么mongo db也有目标包装器。
希望有帮助,我很好奇是否有人对我如何做这些事情有任何建议或意见!