由LogParser和日志分析器GUI授权分析Web服务器数据


原文发表地址 Analyze your Web Server Data and be empowered with LogParser and Log Parser Lizard GUI

原文发表时间 2011 9-04 5:42 AM

从2005年前以来,每当我要深入研究Web服务器日志时,我都会选择用LogParser。这是个很棒的工具。我太爱它了。 Jeff Atwood也对它爱不释手,你也应该这样。也许你不会每天都用它,但是你需要的时候它都能满足你。有点像诺亚方舟。看似低端的工具却能发挥高能量。

The Log Parser Architecture Diagram showing all the inputs and outputs. There are a lot of choices on both sides.

据我所知 Log Parser从2005年以来就没有变过。我和一些同行们合作,希望能跳出原有的框框,我们拭目以待会发生什么。在这之前的这些年,它运行稳定优越。它好就好在当我第一次用IIS日志文件使用LogParser时,它会查询所有你能插入的东西,比如文件系统,事件日志,注册表或者CSV文件。上图摘自它们的文档。

6年前在FeedBurner之前就写过一篇博文,分析了在Newsgator里我的RSS提要的流量。NewsGator是RSS阅读器,包含了在用户代理HTTPHeader中的数据和信息。我跟NuGet团队谈论它们每月最新发布的NuGet版本时就想起这篇文章了,但我不知道有多少人在不断地更新。了解同仁们还有其他什么方法可以获取NuGet提要,还有他们用什么工具来完成都是很有趣的。我自告奋勇要加入,所以David Ebbo发给我一天的日志文件来“了解一下”。

Log Parser很强大因为它让你有效地对文本文件运行SQL询问。以下是从几年前的Atwood的博文中选择的一些样本:

排名前10的最慢项

 1: SELECT TOP 10 cs-uri-stem AS Url, MIN(time-taken) as [Min], 

 2: AVG(time-taken) 
 3: AS [Avg], max(time-taken) AS [Max], 

 4: count(time-taken) AS Hits 

 5: FROM 

 6: ex*.log 

 7: WHERE time-taken < 120000 

 8: GROUP BY Url 

 9: ORDER BY [Avg] 

 10: DESC

每小时的HTTP错误

 1: SELECT date, QUANTIZE(time, 3600) AS Hour, 

 2: sc-status AS Status, COUNT(*) AS 

 3: Errors 

 4: FROM ex*.log 

 5: WHERE (sc-status >= 400) 

 6: GROUP BY date, hour, 

 7: sc-status 

 8: HAVING (Errors > 25) 

 9: ORDER BY Errors DESC

有了这些查询,我认为LogParser是最好的让我探索NuGet web服务器日志的工具。(当然,我知道服务本身也可以监测,但用LogParser更灵活,而且我计划根据日程来进行这些查询,并在http://stats.nuget.org上显示出来。)

有很多种方法可以访问NuGet打包服务器。你可以通过添加包对话框,命令行,Visual Studio中的PowerShell操控台或者NuGet包Explorer访问。还有一些测试数据和“非用户代理”内容。我通过描绘“NuGet”客户端图表过滤出来了。

我从命令行开始做一些初始工作,但进度缓慢。我想查看和返回的东西总显示有问题,以下是我最开始的一些命令行。很繁琐,在命令行中很难创建。

 1: C:\u_ex110831>LogParser.exe -i:IISW3C "SELECT DISTINCT cs(User-Agent) AS 

 2: Client, 

 3: count(1) AS NumberOfHits 

 4: FROM u_ex110831.log 

 5: WHERE Client 

 6:  

 7: LIKE 'NuGet%' 

 8: GROUP BY Client 

 9: ORDER by count(1) DESC"

 10: Client 

 11: NumberOfHits

 12: ------------------------------------------------------------------------------------------- 

 13: ------------

 14: NuGet+Add+Package+Dialog/1.4.20701.9038+(Microsoft+Windows+NT+6.1.7601+Service+Pack+1) 

 15: 38840

 16: NuGet+Command+Line/1.5.20830.9001+(Microsoft+Windows+NT+6.1.7601+Service+Pack+1) 

 17: 15591

 18: NuGet+Add+Package+Dialog/1.4.20701.9038+(Microsoft+Windows+NT+6.1.7600.0) 

 19: 13360

 20: NuGet+Command+Line/1.4.20615.182+(Microsoft+Windows+NT+6.1.7600.0) 

 21: 8562

 22: NuGet+Add+Package+Dialog/1.4.20607.9007+(Microsoft+Windows+NT+6.1.7601+Service+Pack+1) 

 23: 5531

 24: NuGet+Package+Manager+Console/1.4.20701.9038+(Microsoft+Windows+NT+6.1.7601+Service+Pack+1) 

 25: 5497

 26: NuGet+Command+Line/1.4.20615.182+(Microsoft+Windows+NT+6.1.7601+Service+Pack+1) 

 27: 3699

 28: NuGet+Package+Manager+Console/1.4.20701.9038+(Microsoft+Windows+NT+6.1.7600.0) 

 29: 3654

 30: NuGet+Add+Package+Dialog/1.4.20701.9038+(Microsoft+Windows+NT+5.1.2600+Service+Pack+3) 

 31: 3558

 32: NuGet+Command+Line/1.4.20615.182+(Microsoft+Windows+NT+5.2.3790+Service+Pack+2) 

 33: 2539

 34: Press a key...

在这个文件中有40个独特的用户代理,包括客户端,版本和操作系统。我想首先把它们拆分开来,看下使用的是那种NuGet客户端类型。我把行拆分开来,在这个片段中看起来更清晰一点。

 1: C:\u_ex110831>LogParser.exe 

 2: -i:IISW3C "SELECT DISTINCT 

 3: SUBSTR(cs(User-Agent),0, index_of(cs(User-Agent),'/')) AS Client, 

 4: count(1) 

 5: AS NumberOfHits FROM u_ex110831.log

 6: WHERE Client LIKE 'NuGet%'

 7: GROUP BY 

 8: Client

 9: ORDER by count(1) DESC"

 10: Client 

 11: NumberOfHits

 12: ----------------------------- 

 13: ------------

 14: NuGet+Add+Package+Dialog 74761

 15: NuGet+Command+Line 

 16: 32284

 17: NuGet+Package+Manager+Console 12637

 18: NuGet+Package+Explorer 

 19: 943

 20: NuGet+Visual+Studio+Extension 

 21: 49

 22: Statistics:

 23: -----------

 24: Elements processed: 208235

 25: Elements 

 26: output: 5

 27: Execution time: 0.79 seconds 

结果很惊人。一个下属二次查询,就有了25万行长日志文件中的有用信息,而且还没有数据库。这让我回想起20年前用Unix工作的情景。

在几次试验及安装Office Web Components 2003后,运行下列MONSTER命令行弹出了一个图表:

 1: C:\u_ex110831>LogParser.exe -i:IISW3C -o:CHART -chartType:PieExploded 

 2:  

 3: -categories:Off -values:On -view:on

 4: -chartTitle:"NuGet Clients by User 

 5: Agent" 

 6: "SELECT DISTINCT 

 7: SUBSTR(cs(User-Agent),0,index_of(cs(User-Agent),'/')) AS Client, 

 8: count(1) AS 

 9: NumberOfHits 

 10: INTO foo.png 

 11: FROM u_ex110831.log 

 12: WHERE Client

 13: LIKE 

 14: 'NuGet%' 

 15: GROUP BY Client 

 16: ORDER by count(1) DESC"

这留给我一个意味深长的2003式样图表,不过到此还是可以让我小欢呼一下的。我可以使这个(或者再漂亮些的)来按日程运行(或者Chron),并在内部网络中应用。我应该可以显示一个CSV或者XML文件,然后用web服务器进行处理,创建合适的互动图表。不管怎样,小欢呼一下。

clip_image003

我还是觉得对于这个问题我太老了。我的GUI呢?干嘛非要在这里拖拉一个DataGrid呢?大爱DuckDuckGo(没错,这个月我在试DDG)我发现了—等等—LogParser Lizard GUI

LogParser Lizard GUI

这是什么?哦是的,这是智能感应和工具提示,亲爱的!

Log Parser Lizard GUI Main Screen

我不能说我发现LogParser之后它让我的工作效率提高了多少。有趣的是你不知道在赞叹一个好GUI之前你会在命令行里被折磨多久。现在我让Jon Galloway给一些成对的SQL,弄出了另一些查询。

NuGet版本

我过滤除了NuGet包Explorer,因为它有自己的版本模式。不过,我不确定这个查询,因为我想获取主副版本。我注意到很巧第三个值z(x,y,z)总是以.2开始,所以我用了下面的SUB()因为我分不清怎么只滤出x和y值。如果你们有什么好的建议我会很感激的。

 1: SELECT DISTINCT SUBSTR( cs(User-Agent), 

 2:  

 3: ADD(index_of(cs(User-Agent),'/'),1),

 4: SUB(index_of(cs(User-Agent),'.2'),STRLEN(cs(User-Agent))))

 5: AS 

 6: Client, count(1) AS NumberOfHits

 7: FROM u_ex110831.log 

 8: WHERE cs(User-Agent) 

 9: NOT LIKE '%Explorer%' AND cs(User-Agent) LIKE '%NuGet%'

 10: GROUP BY 

 11: Client

 12: ORDER by count(1) DESC 

 13: Client Hits

 14: ------ -----

 15: 1.4 98097

 16: 1.5 18985

 17: 1.3 2524

 18: 1.6 69

然后我做了整个版本:

 1: SELECT SUBSTR( cs(User-Agent), 

 2:  

 3: ADD(index_of(cs(User-Agent),'/'),1),

 4: SUB(index_of(cs(User-Agent),'+('),STRLEN(cs(User-Agent))))

 5: AS 

 6: Client, count(1) AS NumberOfHits

 7: FROM u_ex110831.log 

 8: WHERE cs(User-Agent) 

 9: NOT LIKE '%Explorer%' AND cs(User-Agent) LIKE '%NuGet%'

 10: GROUP BY Client, 

 11: cs(User-Agent)

 12: ORDER by count(1) DESC 

 13: Client Hits

 14: --------------- 

 15: ------

 16: 1.4.20701.9038 38840

 17: 1.5.20830.9001 15591

 18: 1.4.20701.9038 

 19: 13360

 20: 1.4.20615.182 8562

 21: 1.4.20607.9007 5531

 22: 1.4.20701.9037 

 23: 5497

 24: 1.4.20615.182 3699

 25: 1.4.20701.9038 3654

我很惊喜地发现从这些日志文件中获取相当有用,实质性的,有趣的有针对性的数据,速度相当惊人(大约一个小时)。下一步就要获取所有的日志并运行命令行工具来创建月图表了。我们的目标是要弄清楚有多少同仁成功地升级了他们的NuGet,还有他们是怎么使用的。他们使用的是右键菜单还是控制台?

无论是在手机还是自定义客户端,如果你的应用程序使HTTP调用你的服务,,你可以在服务器端监测你的代码来搜集统计信息,在你的IIS日志里有很多信息。你可以用LogParser Lizard GUI来开发你的查询和指定运行命令行工具来生成报告,从而帮你优化产品。这个技术并不像自定义第三方分析包那么复杂,但你会通过LogParser在很短的时间获得惊人的信息。

相关链接


Comments (0)

Skip to main content