欢迎光临 Enjoy IT (ITECN.NET) 登录 | 注册 | 帮助

PowerShell 学习笔记(6):处理IIS日志文件

本文在ITECN首发,未经许可严禁转载!

最近除了在翻译PowerShell Tips之外,还在看一些有关IIS的内容,于是就想将这两者联系起来来解决问题。不过目前版本的PowerShell对IIS支持不是很好,相信后继版本出现后会有所改善。而且对IIS 7而言还有appcmd能用,因此IIS管理方面的内容这里暂且搁置一下,等以后时机成熟后再来讨论。

如我标题所言,今天我们要用PowerShell处理IIS日志。原生的IIS日志看起来不太方便,因此第三方也开发出很多日志分析软件。不过本着“自己动手,丰衣足食”的精神,况且我们又有PowerShell利器在手,难道我们不能征服IIS日志么?

当然仅PowerShell单打独斗是不行的,所谓一个好汉三个帮,这次我们请出的是IIS6.0 Reskit里的Log Parse,这个工具将帮我们将IIS日志转换成csv格式。当然有的朋友会说既然都转成csv了,用Excel打开不就好了。是,的确可以这样,但是我们现在不是在说PowerShell么?:)

用Log Parser将IIS日志转换成CSV的具体命令是:

logparser "select * FROM c:\windows\system32\logfiles\w3svc1\ex070303.log TO test.csv" -o:csv

其中ex070303.log是日志名,可自行修改。test.csv是输出文件名,同样可以自行修改。

然后我们打开导出的csv文件。将开始部分的栏目信息中的“-”,“()”等去除,这样做的目的是防止这些符号被PowerShell误认为操作符。下图就是我修改后的文件截图:

image

然后将文件保存,注意保存时将编码方式选择为Unicode。否则日志中如果有汉字的话,导入powershell后会出现乱码。以上几步就完成了我们的准备工作。下面该PowerShell登场了。

这次我们用到的cmdlet是Import-CSV(明白为什么要转换了吧?^^),这个命令很简单 import-csv后直接跟上csv文件路径即可。下面截图显示的是我将导入的数据存入变量$a中,然后再显示。

image

到这里,基本上工作已做的差不多了,下面我们只需要格式化下输出即可,比如我可以运行以下命令

$a | ft date,time,c_ip,s_ip,sc_status,cs_uri_query

输出结果

image

当然我们会发现有一堆sc_status为200的行,200代表客户端的请求被成功接收,理解并接受。简而言之就是一切正常,那么这些内容不是我们要关心的。我们要关心的是从400开始的4xx系列的客户端错误及5xx系列的服务器端错误,如上图中的某一行内容。那么有没有办法过滤呢?

回答是肯定的,我们只需要使用Where-object(别名 “?” ),因此加上筛选后的命令就是

$a | ?{$_.sc_status -ge 400} |ft date,time,c_ip,s_ip,sc_status,cs_uri_query -a

输出结果

image

呵呵,清晰多了吧?

有朋友也许还会说,显示错误代码多不直观啊,能不能显示更友好点的内容呢?好的,这需要我们写一段脚本了,因为直接在PowerShell界面里输入太痛苦了,以下就是脚本

$log = Import-Csv x:\powershell\ex070306.csv

 

function TranslateErrCode {

         if ($_.sc_status -match 500) {

                   $_.sc_status = $_.sc_status.replace('500','Internal Server Error')

                   $_

         }

         elseif ($_.sc_status -match 404)

         {

                   $_.sc_status = $_.sc_status.replace('404','Not Found')

                   $_             

         }

         else

         {

                   $_

         }

                  

}

 

$log | ?{$_.sc_status -ge 400} | %{TranslateErrCode} | ft date,time,c_ip,sc_status,cs_uri_query -a

脚本内包含了,csv文件读入,错误代码翻译,及最后的输出。当然错误代码翻译只是象征性的写了一部分,有兴趣的朋友不妨自己扩充下。

最后,本文中的IIS日志只是我自己虚拟机上的一些内容,不是很丰富。希望通过本文对各位需要分析IIS日志的朋友有所帮助。

额外奖励提示(^0^)

想统计有多少客户端是使用Maxthon浏览器访问你的网站么,尝试以下命令吧

($a | ?{$_.cs_user_agent -match "Maxthon"}).count

输出结果

image

已发表 2007年9月25日 17:54 作者 ghjconan
归档在:

评论

# re: PowerShell 学习笔记(6):处理IIS日志文件

2007年9月25日 18:33 by anders

顶,支持~

# re: PowerShell 学习笔记(6):处理IIS日志文件

2007年9月25日 20:19 by anders

-match 500  与 -contains 500是一样的么

# re: PowerShell 学习笔记(6):处理IIS日志文件

2007年9月25日 21:16 by ghjconan

-match          正则表达式比较(不区分大小写)

-contains       包含运算符(不区分大小写)

在这个脚本里的区别不是很明显

禁止匿名发表评论