Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
原文发表地址 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在很短的时间获得惊人的信息。
相关链接
