Converting W3C log files to NCSA format
Around a year ago I wrote a blog entry titled "Converting NCSA log files to W3C format", which showed how to use the MSWC.IISLog object to convert log files in the NCSA format back to W3C format. I wrote that blog entry to make up for the fact that the CONVLOG.EXE utility only converts log files to NCSA format, which some older log analysis software packages require. So what happens if you have a bunch of log files in W3C format and you don't have a copy of CONVLOG.EXE on your computer?
This blog entry is something of a reverse direction on my previous post, and shows you how to use the MSUtil.LogQuery object to convert W3C log files to NCSA format. The MSUtil.LogQuery object is shipped with LogParser, which you can download from one of the following URLs:
- Version 2.2 and 2.0: http://www.microsoft.com/download, search for "Log Parser"
- Version 2.1: http://www.microsoft.com/download, search for "IIS 6.0 Resource Kit Tools"
Once you've downloaded and installed the LogParser package, you will need to manually register the LogParser.dll file in order to use the MSUtil.LogQuery object. Having done so, you can use the Windows Script Host (WSH) code in this blog article to convert a folder filled with W3C log files to NCSA 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 your W3C log files, (named "ex*.log"), then double-click it.
Option Explicit
Dim objFSO
Dim objFolder
Dim objInputFile
Dim objOutputFile
Dim objLogQuery
Dim objLogRecordSet
Dim objLogRecord
Dim strInputPath
Dim strOutputPath
Dim strLogRecord
Dim strLogTempSet objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(".")
For Each objInputFile In objFolder.Files
strInputPath = LCase(objInputFile.Name)
If Left(strInputPath,2) = "ex" And Right(strInputPath,4) = ".log" Then
strOutputPath = objFolder.Path & "\" & "nc" & Mid(strInputPath,3)
strInputPath = objFolder.Path & "\" & strInputPathSet objLogQuery = CreateObject("MSUtil.LogQuery")
Set objLogRecordSet = objLogQuery.Execute("SELECT * FROM " & strInputPath)
Set objOutputFile = objFSO.CreateTextFile(strOutputPath)Do While Not objLogRecordSet.atEnd
Set objLogRecord = objLogRecordSet.getRecordstrLogRecord = FormatField(objLogRecord.getValue("c-ip"))
strLogRecord = strLogRecord & " " & FormatField("")
strLogRecord = strLogRecord & " " & FormatField(objLogRecord.getValue("cs-username"))
strLogTemp = BuildDateTime(objLogRecord.getValue("date"),objLogRecord.getValue("time"))
strLogRecord = strLogRecord & " " & FormatField(strLogTemp)
strLogRecord = strLogRecord & " """ & FormatField(objLogRecord.getValue("cs-method"))
strLogRecord = strLogRecord & " " & FormatField(objLogRecord.getValue("cs-uri-stem"))
strLogTemp = FormatField(objLogRecord.getValue("cs-version"))
If strLogTemp = "-" Then
strLogRecord = strLogRecord & " HTTP/1.0"""
Else
strLogRecord = strLogRecord & " " & strLogTemp & """"
End If
strLogRecord = strLogRecord & " " & FormatField(objLogRecord.getValue("sc-status"))
strLogRecord = strLogRecord & " " & FormatField(objLogRecord.getValue("sc-bytes"))objOutputFile.WriteLine strLogRecord
objLogRecordSet.moveNext
Loop
Set objLogQuery = Nothing
objOutputFile.Close
End IfNext
Function FormatField(tmpField)
On Error Resume Next
FormatField = "-"
If Len(tmpField) > 0 Then FormatField = Trim(tmpField)
End FunctionFunction BuildDateTime(tmpDate,tmpTime)
On Error Resume Next
BuildDateTime = "[" & _
Right("0" & Day(tmpDate),2) & "/" & _
Left(MonthName(Month(tmpDate)),3) & "/" & _
Year(tmpDate) & ":" & _
Right("0" & Hour(tmpTime),2) & ":" & _
Right("0" & Minute(tmpTime),2) & ":" & _
Right("0" & Second(tmpTime),2) & _
" +0000]"
End Function
I hope this helps!