由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更灵活,而且我计划根据日程来进行这些查询,并在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服务器进行处理,创建合适的互动图表。不管怎样,小欢呼一下。

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在很短的时间获得惊人的信息。

相关链接