浅析邮件日志(3)
对于统计邮件发送人的情况,我们需要建立另外一个集合,用于存贮每一封邮件的发送人的地址。如果当前发送人地址不在集合中,我们将把这个地址插入集合,并把相应的邮件数量置为初始值1。当我们发现这个邮件发送人的地址已经存在的话,我们就只要把相应邮件数量的值加1。 当完成整个日志文件的分析后,我们的集合对象就能给出想要的统计数据了。
下面是相关的VBScript代码。这个脚本能够分析统计日志文件中发送人的邮件地址,以及他相应发送邮件的数量。把源代码拷贝到一个文本文件中,并以.VBS为扩展名进行命名,例如:ParseLog.vbs。之后,通过以下命令运行脚本。(注:20070109.log是日志文件名。通常还需要提供文件路径。)
CScript ParseLog.VBS 20070109.log
===================代码开始===================
' 本代码的目的是为了更清楚地解释日志的格式和分析方法。仅供大家参考。
' 代码中对很多情况未作特殊处理。因此,作者不建议在生产环境中使用它。
' 如果因不当使用而引起的任何问题,作者不负任何责任。谢谢。
Const conE2kMSGID = 9
Const conSenderaddress = 19
Dim MSGIDArray ' 用于统计MSGID的数组
Dim OriginatorArray ' 用于统计Sender得数组
Dim objFileSystem
Dim strTrackingLogs
Dim objCurrentLog
Dim objKey
Set MSGIDArray = CreateObject("Scripting.Dictionary")
Set OriginatorArray = CreateObject("Scripting.Dictionary")
MSGIDArray.CompareMode = vbTextCompare
OriginatorArray.CompareMode = vbTextCompare
' 从命令行获取日志文件的路径
strTrackingLogs = ""
If WScript.Arguments.count = 1 Then
strTrackingLogs = WScript.Arguments(0)
Else
WScript.Echo "Invalid Log File pathname!"
End If
Set objFileSystem = CreateObject("Scripting.FileSystemObject")
If objFileSystem.FileExists( strTrackingLogs ) Then
Set objCurrentLog = objFileSystem.OpenTextFile( strTrackingLogs,1, FALSE )
' 打开日志文件进行分析
ParseTrackingLog( objCurrentLog )
End If
' 显示统计结果
For Each objKey In OriginatorArray
WScript.Echo CStr(objKey) & ", " & OriginatorArray(objKey)
Next
Sub ParseTrackingLog(byRef objCurrentLog)
'ON ERROR RESUME NEXT
Dim rgStatusArray, strOriginator
' 跳过前5行文件头
objCurrentLog.SkipLine
objCurrentLog.SkipLine
objCurrentLog.SkipLine
objCurrentLog.SkipLine
objCurrentLog.SkipLine
Do While objCurrentLog.AtEndOfStream <> TRUE
' 按行读取列数据到数组里
rgStatusArray = Split(objCurrentLog.ReadLine,Chr(9),-1,vbBinaryCompare)
If UBound(rgStatusArray) = 20 Then
' 记录MSGID,判断该邮件是否被统计过
If Not MSGIDArray.Exists( rgStatusArray(conE2kMSGID) ) Then
MSGIDArray.Add rgStatusArray(conE2kMSGID),1
strOriginator = rgStatusArray(conSenderaddress)
' 记录发送人
If Not OriginatorArray.Exists( strOriginator ) Then
OriginatorArray.Add strOriginator, 1
OriginatorArray.Item(strOriginator)=OriginatorArray.Item(strOriginator)+1
End If
End If
End If
Loop
End Sub
===================代码结束===================

网友评论