Using VBScript to Add Hostnames in CSV Logs
Written By: Kevin Jordan
- 24 May 2006 -
Description: Get your server logs ready for a database by using this VBScript to pull the hostname from a computer and add it to the beginning of each line in a .csv file.
GetHostName() Function
This is a simple function that returns the hostname of the computer the script is running on.
' // * Gets the current systems hostname * // Function GetHostname() Dim objNTInfo Set objNTInfo = CreateObject("WinNTSystemInfo") GetHostName = Ucase(objNTInfo.ComputerName) Set objNTInfo = NOTHING End Function ' GetHostName
The WinNTSystemInfo object stores various things about the computer, such as the domain, username, and obviously the computer name. After we pull this information we convert it to uppercase and then return it.
FileLen(strFilename) Function
I hate having to create two objects every time I need to perform a file operation. It’s just messy to me, so any time I need to do anything like read in a file, write to a file, or in this case, check the size of a file, I create a simple function.
' // * Returns the size of a file * // Function FileLen(strFilename) Dim objFSO, objFile Set objFSO = CreateObject("Scripting.FileSystemObject") ' If the file exists return the file size, otherwise return 0 If objFSO.FileExists(strFileName) Then Set objFile = objFSO.GetFile(strFileName) FileLen = objFile.Size Else FileLen = 0 End If Set objFile = Nothing Set objFSO = Nothing End Function ' FileLen
If you were to call objFSO.GetFile() on something that didn’t exist, your program errors out. So the first thing I did was verify the existence of our file with the objFSO.FileExists() function. If this is true then we create the new object and call the objFile.Size. Otherwise a size of 0 is returned.
Dateyyyymmdd(strDate) Function
If the comments didn’t give it a way, this takes a date from mm/dd/yyyy format and puts it into yyyymmdd format. Whenever you call the built in Date() function it’s return as mm/dd/yyyy. But since we named our files the other way so they’ll sort easier, we’ll need to convert them.
' // * Changes the date from mm/dd/yyyy to yyyymmdd * // Function Dateyyyymmdd(strDate) Dim strDatePieces strDatePieces = Split(strDate, "/") If strDatePieces(0) < 10 Then strDatePieces(0) = "0" & strDatePieces(0) End If If strDatePieces(1) < 10 Then strDatePieces(1) = "0" & strDatePieces(1) End If Dateyyyymmdd = strDatePieces(2) & _ strDatePieces(0) & _ strDatePieces(1) End Function ' Dateyyyymmdd
We start by splitting up the date anywhere there is a ‘/’, and storing those values into an array called strDatePieces.
We’ll also need the trailing 0s in front of single digit months and days, so next we look at strDatePieces(0), which is the month. If it’s less than 10, then it’ll be single digit and we’ll add that 0 in front. This is repeated form strDatePieces(1), which is the day of the month.
Finally, the reordered string is returned in the new format.
Stupid IIS 5 Logs
Sadly, some of our servers are still IIS 5.0 (meaning they’re running Windows 2000). The problem lies in the fact that IIS 5.0 doesn’t generate an HTTPERR log. So I could have either created two scripts (one for IIS 5.0 and one for IIS 6.0), or add an extra step to get rid of the results of Log Parser when it’s unable to run successfully. Since I didn’t want to mess with maintaining two different scripts, I picked the latter.
Whenever Log Parser fails to query a specific log, a “Task aborted.” message is returned. The KillTaskAborted(strFileName) function deletes any files that contain that string.
' // * Deletes files containing "Task Aborted" * // Sub KillTaskAborted(strFileName) Dim objFSO, objFile, strText Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileExists(strFileName) Then Set objFile = objFSO.OpenTextFile(strFileName, 1) strText = objFile.ReadAll objFile.Close If InStr(strText, "Task aborted.") Then ObjFSO.DeleteFile strFileName End If End If Set objFSO = NOTHING Set objFile = NOTHING End Sub ' KillTaskAborted
The function is pretty simple. First check if the file even exists, objFSO.FileExists(). If it does, then open it up, objFSO.OpenTextFile(), and then read in the contents with objFile.ReadAll.
If InStr(strText, "Task aborted.") Then ObjFSO.DeleteFile strFileName End If
Right here it checks if “Task aborted.” is anywhere within the file. If so, then objFSO. DeleteFile is used to get rid of it. Having our database filled with aborted messages, would have been meaningless and most likely a pain to sift through.