Тема: VBS: Обработчик текстовых логов, вставка полученных данных в Oracle
Доброго времени суток.
Необходимо:
VBS обработчик текстовых логов, который умеет вставлять полученные данные, из лог-файлов, в Oracle.
Имеется:
- лог-файлы такого типа: "ex10091011.log" (создан сервером 10.09.2010, с чего следует, что в имени файла сначало стоит год, месяц, число, и "11" - время, когда был создан лог в часах), которые находятся в определенной папке (к примеру С:\Logs\)
- в каждом из этих файлов первые 4 строки считывать ненужно (Там находится информация за знаком "#" о том, что это за лог, и кто его создал, и какие поля он в себе содержит через разделитель пробел)
Вот и само содержание лог-файла:
#Software: Microsoft Internet Information Services 6.0
#Version: 1.0
#Date: 2010-09-10 11:04:29
#Fields: date time cs-method cs-uri-stem cs-uri-query s-port c-ip cs-host sc-status sc-substatus sc-bytes cs-bytes time-taken
2010-09-10 11:04:29 GET /index.html - 8080 127.0.0.1 test.com.ua:8080 200 0 3902 724 312
2010-09-10 11:04:46 GET /person.html - 8080 127.0.0.1 test.com.ua:8080 404 0 2102 694 0
- в Oracle создана таблица (STATS_SITE) с такими же полями что и в лог-файле:
| DATA | TIME | CS_METHOD | CS_URI_STEM | CS_URI_QUERY | S_PORT | C_IP | CS_HOST | SC_STATUS | SC_SUBSTATUS | SC_BYTES | CS_BYTES | TIME_TAKEN |
(Разделитель "|" вставлен для удобства чтения)
Постановка задачи:
- считать каждое поле с каждой строки лог-файла(2010-09-20, 11:04:29, GET, /index.html, 8080, 127.0.0.1, test.com.ua:8080, 200, 0, 3902, 724, 312) и добавить в таблицу оракла STATS_SITE по соответственным полям.
Например:
- в строке №5 первое поле, до первого пробела, имеет вид 2010-09-10, его нужно считать с лога и добавить в Oracle таблицу STATS_SITE в ячейку DATA, ну и так дальше...
Мои размышления.
Часть 1. Первое что лучше сделать - скопировать из папки, куда генерируются лог-файлы сервером, все логи, к примеру за сутки, в новую папку - "Temp"(в этой папке будут содержатся те лог-файлы которые были созданы в период между последними запусками скрипта), если скопировать один из логов не удалость, то и фиг с ним пусть остается, поскольку планировщик позже запустит скрипт снова и занятый процессом лог-файл уже будет свободен. Дальше очистить корневую папку (С:\Logs\ - это делается для очистки диска на котором работает сервер, ибо с практики этих лог-файлов потом создается на сотни мегабайт, что очень плохо), потом создать еще одну папку "AllLogs" - в ней будут хранится логи за период одного месяца и каждые 30 дней очищятся, мало ли, а вдруг сервер оракла упадет.
Эту часть я решил. Скрипт создан и чудесно работает.
Часть 2. Процес считывания лог-файла. Теоретически понятно, что нужно использовать FSO, но как описать нужные мне поля?Создать временный файл и записать построчно все поля, разделенные в каждой строке пробелом, что нужны мне и сделать запрос в базу, но как это сделать максимально безболезненно?
Если позволите я выложу где я "хожу" вокруг да около, а вы если не сложно подскажите практическими примерами что да как...
Dim FSO, file, fileName
fileName = "С:\Temp\ex10091011.log"
Set FSO = CreateObject("Scripting.FileSystemObject")
if Not FSO.FileExists(fileName) Then
Set file = FSO.CreateTextFile(fileName, true)
file.Close
End if
Set file = FSO.GetFile(fileName)
Dim text
Set text = FSO.OpenTextFile(fileName, 1, false)
Dim stringArray, lastString, idx
stringArray = Split(text.ReadAll, Chr(10), -1, 1)
text.Close
idx = UBound(stringArray)
Do Until idx < 0
lastString = stringArray(idx)
if Len(lastString) > 0 Then
Dim data, time, cs-method, cs-uri-stem, cs-uri-query, s-port, c-ip, cs-host, sc-status, sc-substatus, sc-bytes, cs-bytes, time-taken, parsing, count
parsing = Split(lastString, " ")
count = UBound(parsing)
if (count > 13) Then
data = parsing(0)
time = parsing(1)
cs-method = parsing(2)
cs-uri-stem = parsing(3)
cs-uri-query = parsing(4)
s-port = parsing(5)
c-ip = parsing(6)
cs-host = parsing(7)
sc-status = parsing(8)
sc-substatus = parsing(9)
sc-bytes = parsing(10)
cs-bytes = parsing(11)
time-taken = parsing(12)
' ??????????????????????
' ?????????????????????? по идее цикл если i>13 then ??? то что?
End If
End If
idx = idx - 1
Loop
'Конектимся к базе и отправляем полученные данные в таблицу
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase("oracle.test", "testUser/testPass", 0)
OraDatabase.ExecuteSQL("ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '.`'")
OraDatabase.ExecuteSQL("ALTER SESSION SET NLS_DATE_FORMAT = 'dd.mm.yyyy hh24:mi:ss'")
OraDatabase.ExecuteSQL("INSERT INTO STATS_SITE VALUES ( " & data & ", " & time & ", " & cs-method & ", " & cs-uri-stem & ", " & cs-uri-query & ", " & s-port & ", " & c-ip & ", " & cs-host & "," & sc-status & "," & sc-substatus & ", " & sc-bytes & ", " & cs-bytes & ", " & time-taken & ")")
Код с ошибками, "возможно" специальными... Это сделанно с целью отсеивания ответов вида: "да зайди в гугл там все есть", "учите матчасть" и т.д. и т.п.
Мне нужны практические примеры!
З.Ы. Человек который дельно поможет не останется без материального "Спасибо"!