一、如何获取到Correlation ID。
一般而言,我们可以从Sharepoint网站的错误页面上看到报错信息中包含的CorrelationID,如下图 。
当然,我们也可以编写代码来主动获取CorrelationID,并提取附加信息发布或保存到我们指定的地方,参见Sharepoint学习笔记—Debug--使用代码获取当前Request的CorrelationID
我们还可以从Developer Dashboard那里得到Correlation ID,如下图:
二、在PowerShell中使用CorrelationID
使用PowerShell通过Correlation ID在SharePoint日志中查找详细的错误信息,这种方式的优点就是它可以直接对ULS文件进行处理,但它最明显的缺点就是:你无法使用它来查找同一Farm上的其它Servers中的日志,也无法使用它来访问log数据库。通常的作法是使用Merge-SPLogFile命令(http://65.55.20.225/zh-cn/library/ff607721.aspx)或New-SPLogFile命令(http://65.55.20.225/zh-cn/library/ff607615.aspx)先合并Farm中不同Server上的跟踪日志条目,然后再针对合并后的日志文档进行分析(New-SPLogFile命令的作用是先中止当前正在记录的Log文档,重新开始创建一个新的Log文档,这样可以帮助我们缩小跟踪的范围)。
当然,如果你没有对Sharepoin进行ULS的配置,Sharepoint就不会把log信息保存到数据库。如下图结合此文(Sharepoint学习笔记—Debug--寻找 WSS_Logging下的ULSTraceLog)对ULS进行配置,
下图就是配置Sharepoint Trace Log的界面,在此界面上选择要把哪些Event事件写入到log中
通过此处进入配置界面
通过此界面进行设置
如果有些Sharepoint环境,没有创建ULS数据库视图(ULSTraceLog),你就只有通过ULSViewer或Powershell来帮助你进行分析了。
下面是一些常用的提取信息的方法:
1.根据CorrelationID提取Log记录
1.1在全部Log记录中提取
1.2从10分钟前产生的Log记录中提取
1.3把提取的log记录输出到指定文件中
2.其它Get-SPLogEvent常见用法
1.1 提取过去10分钟,Level为Hight的记录
1.2 提取过去10分钟,Level为Hight的记录,只提取前25项,并按它们的category进行排序
1.3查看过去半个小时里,我们的Timer Jobs都发生了什么事情
1.4提取给定时间区间内的记录
1.5提取前10条和最后2条Events记录
关于get-SPLogEvent命令,再进一步的用法请参见(http://technet.microsoft.com/zh-cn/library/ff607589.aspx)
三、在ULSViewer中使用CorrelationID
你可以在ULSViewer中(请从此处下载)使用CorrelationID来设置Filter,从而帮助你快速的定位错误信息。如图:
四、在日志数据库(ULSTraceLog)中,使用CorrelationID
如果你作了适当的设置(请参见 Sharepoint学习笔记—Debug--寻找 WSS_Logging下的ULSTraceLog),你的Sharepoint就会在WSS_Logging的数据库中创建一个名为ULSTraceLog的视图,在这个视图里可以查找到详细的错误信息。使用此方法的好处是:在一个Farm中的所有Server上的event log都要写入到此数据库中.
首先我们观查一下这个数据库WSS_Logging中的数据表如下图(只截取了部分作为说明)
我们可以看到,针对这些数据表都跟有 "Partition + 数字" 作为后缀,事实上,它们对应的就是一个月取31天的每一天的记录。
我们再打开ULSTraceLog视图设计看看其代码,也可以看出,它就是取上述相关Partition表的Union集(如下图)。
有了CorrelationID,我们可以使用如下SQL命令来提取我们想要的信息.
from dbo.ULSTraceLog
where CorrelationId= ' f3449978-ebd5-4491-98cb-0c7861b0237f '
结果如下:
五、使用第三方的CorrelationID Query Feature
网上有人提供了第三方的Feature来帮助你在整个Sharepoint Farm中对correlation ID进行查询,你可以从 SharePoint 2010 Query Correlation ID Central Admin Page 下载。使用Add-SPSolution 命令进行安装。
然后在Administrator Center中进行部署。部署成功后请到Monitor中去找到Logging,如下图
进入此功能,输入你的关注的CorrelationID,就可以查询其信息了。
SharePoint中自定义的webpart, event handler, workflow非常常见. 这些集成了的东西如果报错很难排查. 这篇文章列出介绍简单的使用ULS日志的方法.
参考下面的资料来了解如何向ULS日志中写入信息
==============
SharePoint Trace Logs and the Unified Logging Service (ULS)
Writing to the Trace Log
http://msdn.microsoft.com/en-us/library/aa979595.aspx
Trace Log Example
http://msdn.microsoft.com/en-us/library/aa979522.aspx
知道了怎么写, 还需要知道要写什么. 排查错误最需要的信息, 就是丢出错误的代码位置. 知道了位置之后, 才可以展开相应的一些猜想, 验证, 或者再添入一些可疑对象字段的值的日志输出.
下面的代码段显示了如何从exception中拿到错误的行号等信息.
static void Main(string[] args) { try { Fun1(); } catch (Exception ex) { System.Diagnostics.StackTrace trace = new System.Diagnostics.StackTrace(ex, true); Console.WriteLine(trace.GetFrame(0).GetMethod().Name); //Get deepest error function. Console.WriteLine("Line: " + trace.GetFrame(0).GetFileLineNumber()); //Get error line number. Console.WriteLine("Column: " + trace.GetFrame(0).GetFileColumnNumber()); Console.WriteLine(ex.ToString());//All in one! This one is simplest. } } static void Fun1() { throw new Exception("An error has happened"); }
System.Diagnostics.StackTrace的GetFrame(index)方法可以得到StackFrame对象, Stack Frame的index是从0开始的, 0是最后一个入栈的stackframe.