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误认为操作符。下图就是我修改后的文件截图:

然后将文件保存,注意保存时将编码方式选择为Unicode。否则日志中如果有汉字的话,导入powershell后会出现乱码。以上几步就完成了我们的准备工作。下面该PowerShell登场了。
这次我们用到的cmdlet是Import-CSV(明白为什么要转换了吧?^^),这个命令很简单 import-csv后直接跟上csv文件路径即可。下面截图显示的是我将导入的数据存入变量$a中,然后再显示。

到这里,基本上工作已做的差不多了,下面我们只需要格式化下输出即可,比如我可以运行以下命令
|
$a | ft date,time,c_ip,s_ip,sc_status,cs_uri_query |
输出结果

当然我们会发现有一堆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 |
输出结果

呵呵,清晰多了吧?
有朋友也许还会说,显示错误代码多不直观啊,能不能显示更友好点的内容呢?好的,这需要我们写一段脚本了,因为直接在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 |
输出结果
