由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也对它爱不释手,你也应该这样。也许你不会每天都用它,但是你需要的时候它都能满足你。有点像诺亚方舟。看似低端的工具却能发挥高能量。
据我所知 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更灵活,而且我计划根据日程来进行这些查询,并在https://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服务器进行处理,创建合适的互动图表。不管怎样,小欢呼一下。
我还是觉得对于这个问题我太老了。我的GUI呢?干嘛非要在这里拖拉一个DataGrid呢?大爱DuckDuckGo(没错,这个月我在试DDG)我发现了—等等—LogParser Lizard GUI。
LogParser Lizard GUI
这是什么?哦是的,这是智能感应和工具提示,亲爱的!
我不能说我发现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在很短的时间获得惊人的信息。
相关链接