30. November 2005
Bob
IIS , Scripting
One of the great utilities that ships with IIS is the CONVLOG.EXE application, which converts W3C or MS Internet Standard log files to NCSA format, where they can be processed by any of the applications that only parse NCSA log file information. The trouble is, what happens when you already have NCSA log files and you want W3C log files? You can't use the CONVLOG.EXE application, it only works in the opposite direction.
With that in mind, I wrote the following Windows Script Host (WSH) script that will read the current directory and convert all NCSA-formatted log files to W3C format. To use this code, just copy the code into notepad, and save it with a ".vbs" file extension on your system. To run it, copy the script to a folder that contains NCSA log files, (named "nc*.log"), then double-click it.
Option Explicit
Dim objIISLog
Dim objFSO
Dim objFolder
Dim objFile
Dim objOutputFile
Dim strInputPath
Dim strOutputPath
Dim strLogRecord
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(".")
For Each objFile In objFolder.Files
strInputPath = LCase(objFile.Name)
If Left(strInputPath,2) = "nc" And Right(strInputPath,4) = ".log" Then
strOutputPath = objFolder.Path & "\" & "ex" & Mid(strInputPath,3)
strInputPath = objFolder.Path & "\" & strInputPath
Set objIISLog = CreateObject("MSWC.IISLog")
objIISLog.OpenLogFile strInputPath, 1, "", 0, ""
Set objOutputFile = objFSO.CreateTextFile(strOutputPath)
objIISLog.ReadLogRecord
objOutputFile.WriteLine "#Software: Microsoft Internet Information Services 5.0"
objOutputFile.WriteLine "#Version: 1.0"
objOutputFile.WriteLine "#Date: " & BuildDateTime(objIISLog.DateTime)
objOutputFile.WriteLine "#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status cs(User-Agent)"
Do While Not objIISLog.AtEndOfLog
strLogRecord = BuildDateTime(objIISLog.DateTime)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.ClientIP)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.UserName)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.ServerIP)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.ServerPort)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.Method)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.URIStem)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.URIQuery)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.ProtocolStatus)
strLogRecord = strLogRecord & " " & FormatField(objIISLog.UserAgent)
objOutputFile.WriteLine strLogRecord
objIISLog.ReadLogRecord
Loop
objIISLog.CloseLogFiles 1
objIISLog = Null
End If
Next
Function FormatField(tmpField)
On Error Resume Next
FormatField = "-"
If Len(tmpField) > 0 Then FormatField = Trim(tmpField)
End Function
Function BuildDateTime(tmpDateTime)
On Error Resume Next
tmpDateTime = CDate(tmpDateTime)
BuildDateTime = Year(tmpDateTime) & "-" & _
Right("0" & Month(tmpDateTime),2) & "-" & _
Right("0" & Day(tmpDateTime),2) & " " & _
Right("0" & Hour(tmpDateTime),2) & ":" & _
Right("0" & Minute(tmpDateTime),2) & ":" & _
Right("0" & Second(tmpDateTime),2)
End Function
I hope this helps!