Just a short, simple blog for Bob to share his thoughts.
07 November 2006 • by Bob • IIS, LogParser
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:
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 strLogTemp Set 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 & "\" & strInputPath Set objLogQuery = CreateObject("MSUtil.LogQuery") Set objLogRecordSet = objLogQuery.Execute("SELECT * FROM " & strInputPath) Set objOutputFile = objFSO.CreateTextFile(strOutputPath) Do While Not objLogRecordSet.atEnd Set objLogRecord = objLogRecordSet.getRecord strLogRecord = 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 If Next Function FormatField(tmpField) On Error Resume Next FormatField = "-" If Len(tmpField) > 0 Then FormatField = Trim(tmpField) End Function Function 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!
Tags: IIS, Scripting, Log Files, Log Parser