VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
Формулировка задачи:
Доброго времени суток.
Необходимо:
VBS обработчик текстовых логов, который умеет вставлять полученные данные, из лог-файлов, в Oracle.
Имеется:
- лог-файлы такого типа: "ex10091011.log" (создан сервером 10.09.2010, с чего следует, что в имени файла сначало стоит год, месяц, число, и "11" - время, когда был создан лог в часах), которые находятся в определенной папке (к примеру С:\Logs\)
- в каждом из этих файлов первые 4 строки считывать ненужно (Там находится информация за знаком "#" о том, что это за лог, и кто его создал, и какие поля он в себе содержит через разделитель пробел)
Вот и само содержание лог-файла:
- в 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 первое поле, до первого пробела, имеет вид
Мои размышления.
Эту часть я решил. Скрипт создан и чудесно работает. ;)
Если позволите я выложу где я "хожу" вокруг да около, а вы если не сложно подскажите практическими примерами что да как...
Код с ошибками, "возможно" специальными... Это сделанно с целью отсеивания ответов вида: "да зайди в гугл там все есть", "учите матчасть" и т.д. и т.п.
Мне нужны практические примеры!
З.Ы. Человек который дельно поможет не останется без материального "Спасибо"! ;)
Необходимо:
VBS обработчик текстовых логов, который умеет вставлять полученные данные, из лог-файлов, в Oracle.
Имеется:
- лог-файлы такого типа: "ex10091011.log" (создан сервером 10.09.2010, с чего следует, что в имени файла сначало стоит год, месяц, число, и "11" - время, когда был создан лог в часах), которые находятся в определенной папке (к примеру С:\Logs\)
- в каждом из этих файлов первые 4 строки считывать ненужно (Там находится информация за знаком "#" о том, что это за лог, и кто его создал, и какие поля он в себе содержит через разделитель пробел)
Вот и само содержание лог-файла:
- в 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, но как описать нужные мне поля?Создать временный файл и записать построчно все поля, разделенные в каждой строке пробелом, что нужны мне и сделать запрос в базу, но как это сделать максимально безболезненно?Если позволите я выложу где я "хожу" вокруг да около, а вы если не сложно подскажите практическими примерами что да как...
Код с ошибками, "возможно" специальными... Это сделанно с целью отсеивания ответов вида: "да зайди в гугл там все есть", "учите матчасть" и т.д. и т.п.
Мне нужны практические примеры!
З.Ы. Человек который дельно поможет не останется без материального "Спасибо"! ;)
Решение задачи: «VBS:Обработчик текстовых логов, вставка полученных данных в Oracle»
textual
Листинг программы
<font color="00AA00">' Для запуска скрипта пропишите в командной строке: cscript D:\A-MAIN\test.vbs D:\A-MAIN\INOUT /tD:\A-MAIN\123 /lD:\A-MAIN\test.log</font> del_vbslog = True files_move = True log_reader = True Check_Conditions = True query_sql = True query_sql_f = True <font color="blue">Dim</font> SourceFolder, pathTo, idx, file, FSO, FileLog, OutToEvLog <font color="blue">Dim</font> ws: <font color="blue">Set</font> ws = CreateObject(<font color="teal">"WScript.Shell"</font>) OutToEvLog = False SourceFolder = <font color="teal">""</font> pathTo = <font color="teal">""</font> <font color="blue">Set</font> FSO = CreateObject(<font color="teal">"Scripting.FileSystemObject"</font>) FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)-<font color="darkblue"><b>4</b></font>)) & <font color="teal">"_"</font> & DatePart(<font color="teal">"yyyy"</font>,<font color="blue">Date</font>) & <font color="teal">"_"</font> & DatePart(<font color="teal">"m"</font>,<font color="blue">Date</font>) & <font color="teal">"_"</font> & DatePart(<font color="teal">"d"</font>,<font color="blue">Date</font>) & <font color="teal">"."</font> & <font color="teal">"log"</font> Main() <font color="00AA00">'-----------------------------------------------------------</font> <font color="blue">Sub</font> Main() <font color="blue">If</font> Check_Conditions <font color="blue">Then</font> CheckConditions() <font color="blue">If</font> del_vbslog <font color="blue">Then</font> DelVbsLog() <font color="blue">If</font> files_move <font color="blue">Then</font> LogFilesMove() <font color="blue">If</font> log_reader <font color="blue">Then</font> LogReader() <font color="blue">End</font> <font color="blue">Sub</font> <font color="00AA00">'-----------------------------------------------------------</font> <font color="00AA00">'Удаляем лог-файл нашего скрипта, если таковой существует</font> <font color="blue">Sub</font> DelVbsLog() <font color="blue">If</font> FSO.FileExists(FileLog) <font color="blue">Then</font> <font color="blue">Set</font> File = FSO.GetFile(FileLog) <font color="blue">Const</font> DELETE_FILE_FORCE = True File.Delete DELETE_FILE_FORCE <font color="blue">End</font> <font color="blue">If</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="00AA00">'-----------------------------------------------------------</font> <font color="00AA00">'-----------------------------------------------------------</font> <font color="00AA00">'Перемещаем лог-файлы в папку Export_To_Oracle</font> <font color="blue">Sub</font> LogFilesMove() <font color="blue">If</font> <font color="blue">Not</font> FSO.FolderExists(pathTo) <font color="blue">Then</font> FSO.CreateFolder pathTo <font color="blue">End</font> <font color="blue">If</font> <font color="00AA00">'Удаляем все файлы что находятся в папке pathTo</font> <font color="blue">Dim</font> FileList, AFile <font color="blue">Set</font> Folder = FSO.GetFolder(pathTo) <font color="blue">Set</font> FileList = Folder.Files <font color="blue">For</font> <font color="blue">Each</font> AFile <font color="blue">In</font> FileList AFile.Delete <font color="blue">Next</font> <font color="blue">On</font> <font color="blue">Error</font> <font color="blue">Resume</font> <font color="blue">Next</font> WriteLog(<font color="teal">"Перемещены\скопированы следующие файлы: "</font> & vbCrLf) <font color="blue">For</font> <font color="blue">Each</font> File <font color="blue">In</font> FSO.GetFolder(SourceFolder).Files path_to_file=pathTo & <font color="teal">"\"</font> & File.<font color="blue">Name</font> <font color="blue">if</font> FSO.FileExists(path_to_file) <font color="blue">then</font> FSO.DeleteFile(path_to_file) FSO.MoveFile File.Path, path_to_file <font color="blue">If</font> Err.number <> <font color="darkblue"><b>70</b></font> <font color="blue">Then</font> Log_Ok_Or_ErrorAndQuit WriteLog(path_to_file) <font color="blue">Next</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Sub</font> Log_Ok_Or_ErrorAndQuit <font color="blue">If</font> Err.number <> <font color="darkblue"><b>0</b></font> <font color="blue">Then</font> WriteLog <font color="teal">"Error #"</font> + Err.number + <font color="teal">" :"</font> + Err.Description, <font color="darkblue"><b>1</b></font> WScript.Quit <font color="blue">End</font> <font color="blue">if</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="00AA00">'-----------------------------------------------------------</font> <font color="00AA00">'Обрабатываем каждый лог-файл и производим запись в БД</font> <font color="blue">Sub</font> LogReader() <font color="blue">Dim</font> TheFolder, TheFiles, fileName <font color="blue">Set</font> TheFolder = FSO.GetFolder(pathTo) <font color="blue">Set</font> TheFiles = TheFolder.Files <font color="blue">Set</font> OraSession = CreateObject(<font color="teal">"OracleInProcServer.XOraSession"</font>) <font color="blue">Set</font> OraDatabase = OraSession.OpenDatabase(<font color="teal">"oracle.test"</font>, <font color="teal">"test/pass"</font>, <font color="darkblue"><b>0</b></font>) OraDatabase.ExecuteSQL(<font color="teal">"ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '.`'"</font>) <font color="blue">For</font> <font color="blue">Each</font> fileName <font color="blue">In</font> TheFiles <font color="blue">if</font> <font color="blue">Not</font> FSO.FileExists(fileName) <font color="blue">Then</font> <font color="blue">Set</font> file = FSO.CreateTextFile(fileName, true) file.<font color="blue">Close</font> <font color="blue">End</font> <font color="blue">if</font> <font color="blue">Set</font> file = FSO.GetFile(fileName) <font color="blue">Dim</font> text <font color="blue">Set</font> text = FSO.OpenTextFile(fileName, <font color="darkblue"><b>1</b></font>, false) WriteLog(vbCrLf & <font color="teal">"Был обработан файл: "</font> & vbCrLf & fileName) <font color="blue">Dim</font> stringArray, lastString stringArray = Split(text.ReadAll, vbnewline) text.<font color="blue">Close</font> WriteLog(vbCrLf & <font color="teal">"Выполнены следующие действия: "</font>) idx = UBound(stringArray) isRunCommit = false <font color="blue">Do</font> <font color="blue">Until</font> idx < <font color="darkblue"><b>0</b></font> lastString = stringArray(idx) <font color="blue">if</font> Len(lastString) > <font color="darkblue"><b>0</b></font> <font color="blue">and</font> left(laststring,<font color="darkblue"><b>1</b></font>)<><font color="teal">"#"</font> <font color="blue">Then</font> <font color="blue">Dim</font> data, <font color="blue">time</font>, cs_method, cs_uri_stem, cs_uri_query, s_port, c_ip, sc_status, sc_substatus, sc_bytes, cs_bytes, time_taken, parsing, count parsing = Split(lastString, <font color="teal">" "</font>) count = UBound(parsing) <font color="blue">if</font> (count > <font color="darkblue"><b>5</b></font>) <font color="blue">Then</font> data = parsing(<font color="darkblue"><b>0</b></font>) <font color="blue">time</font> = parsing(<font color="darkblue"><b>1</b></font>) cs_method = parsing(<font color="darkblue"><b>2</b></font>) cs_uri_stem = parsing(<font color="darkblue"><b>3</b></font>) cs_uri_query = parsing(<font color="darkblue"><b>4</b></font>) s_port = parsing(<font color="darkblue"><b>5</b></font>) c_ip = parsing(<font color="darkblue"><b>6</b></font>) sc_status = parsing(<font color="darkblue"><b>7</b></font>) sc_substatus = parsing(<font color="darkblue"><b>8</b></font>) sc_bytes = parsing(<font color="darkblue"><b>9</b></font>) cs_bytes = parsing(<font color="darkblue"><b>10</b></font>) time_taken = parsing(<font color="darkblue"><b>11</b></font>) <font color="blue">if</font> query_sql <font color="blue">Then</font> <font color="blue">if</font> cs_uri_query = <font color="teal">"-"</font> <font color="blue">Then</font> cs_uri_query = <font color="teal">""</font> <font color="blue">else</font> cs_uri_query = Replace(cs_uri_query, <font color="teal">"'"</font>, <font color="teal">"'||chr(39)||'"</font>) <font color="blue">End</font> <font color="blue">if</font> sql = <font color="teal">"INSERT INTO STATS_SP_WEB VALUES ( to_date('"</font> & data & <font color="teal">" "</font> & <font color="blue">time</font> & <font color="teal">"', 'yyyy-mm-dd hh24:mi:ss'), '"</font> & cs_method & <font color="teal">"', '"</font> & cs_uri_stem & <font color="teal">"', '"</font> & cs_uri_query & <font color="teal">"', '"</font> & s_port & <font color="teal">"', '"</font> & c_ip & <font color="teal">"', '"</font> & sc_status & <font color="teal">"', '"</font> & sc_substatus & <font color="teal">"', '"</font> & sc_bytes & <font color="teal">"', '"</font> & cs_bytes & <font color="teal">"', '"</font> & time_taken & <font color="teal">"')"</font> OraDatabase.ExecuteSQL(sql) isRunCommit = true WriteLog(vbCrLf & sql) <font color="blue">End</font> <font color="blue">if</font> <font color="blue">if</font> query_sql_f <font color="blue">Then</font> <font color="00AA00">'Отфильтровуем полученные строки и записываем в БД №2</font> <font color="blue">if</font> Right(cs_uri_stem, <font color="darkblue"><b>4</b></font>) = <font color="teal">"ashx"</font> <font color="blue">or</font> Left(cs_uri_stem, <font color="darkblue"><b>9</b></font>) = <font color="teal">"/Services"</font> <font color="blue">Then</font> sql_f = <font color="teal">""</font> <font color="blue">else</font> sql_f = <font color="teal">"INSERT INTO STATS_SP_WEB_F VALUES ( to_date('"</font> & data & <font color="teal">" "</font> & <font color="blue">time</font> & <font color="teal">"', 'yyyy-mm-dd hh24:mi:ss'), '"</font> & cs_method & <font color="teal">"', '"</font> & cs_uri_stem & <font color="teal">"', '"</font> & cs_uri_query & <font color="teal">"', '"</font> & s_port & <font color="teal">"', '"</font> & c_ip & <font color="teal">"', '"</font> & sc_status & <font color="teal">"', '"</font> & sc_substatus & <font color="teal">"', '"</font> & sc_bytes & <font color="teal">"', '"</font> & cs_bytes & <font color="teal">"', '"</font> & time_taken & <font color="teal">"')"</font> OraDatabase.ExecuteSQL(sql_f) isRunCommit = true WriteLog(vbCrLf & sql_f) <font color="blue">End</font> <font color="blue">if</font> <font color="blue">End</font> <font color="blue">if</font> <font color="blue">End</font> <font color="blue">If</font> <font color="blue">End</font> <font color="blue">If</font> idx = idx - <font color="darkblue"><b>1</b></font> <font color="blue">Loop</font> <font color="blue">Next</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Sub</font> CheckConditions <font color="blue">dim</font> i, s, sLen, strKey, strValue, strErrors <font color="blue">Set</font> Args = WScript.Arguments <font color="blue">If</font> Args.Count < <font color="darkblue"><b>1</b></font> <font color="blue">then</font> ShowHelp strErrors = <font color="teal">""</font> SourceFolder = Args(<font color="darkblue"><b>0</b></font>) <font color="blue">For</font> i = <font color="darkblue"><b>1</b></font> <font color="blue">to</font> Args.Count - <font color="darkblue"><b>1</b></font> s = Args(i) sLen = Len(s) strKey = Left(s, <font color="darkblue"><b>2</b></font>) <font color="blue">If</font> sLen > <font color="darkblue"><b>1</b></font> <font color="blue">Then</font> strValue = Right(s, Len(s) - <font color="darkblue"><b>2</b></font>) <font color="blue">On</font> <font color="blue">Error</font> <font color="blue">Resume</font> <font color="blue">Next</font> <font color="blue">If</font> strValue = <font color="teal">""</font> <font color="blue">Then</font> Err.Raise vbObjectError + <font color="darkblue"><b>2</b></font>, <font color="teal">"Наличие значения обязательно. Неправильно указан параметр"</font> <font color="blue">Select</font> <font color="blue">Case</font> strKey <font color="blue">Case</font> <font color="teal">"/t"</font> pathTo = strValue <font color="blue">Case</font> <font color="teal">"/f"</font> query_sql = sql_f <font color="blue">Case</font> <font color="teal">"/s"</font> query_sql_f = sql <font color="blue">Case</font> <font color="teal">"/l"</font> FileLog = strValue <font color="blue">Case</font> <font color="blue">Else</font> Err.Raise vbObjectError + <font color="darkblue"><b>1</b></font>, WScript.ScriptFullName, <font color="teal">"Ошибка в параметрах командной строки"</font> <font color="blue">End</font> <font color="blue">Select</font> <font color="blue">Next</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="00AA00">'-----------------------------------------------------------</font> <font color="00AA00">'Функция записи лог файла</font> <font color="blue">Sub</font> WriteLog(Text) <font color="blue">Const</font> ForReading = <font color="darkblue"><b>1</b></font>, ForWriting = <font color="darkblue"><b>2</b></font> <font color="blue">Dim</font> f <font color="blue">Set</font> f = FSO.OpenTextFile(FileLog, <font color="darkblue"><b>8</b></font>, True) f.<font color="blue">Write</font> Text & vbCrLf f.<font color="blue">Close</font> <font color="blue">End</font> <font color="blue">Sub</font> <font color="blue">Sub</font> ShowHelp WScript.Echo <font color="teal">"Usage: "</font> & WScript.ScriptFullName & <font color="teal">" <Путь> [<Ключи>]"</font> & vbNewLine & _ <font color="teal">"<Путь> - Папка, в которой лежат логи"</font> & vbNewLine & _ <font color="teal">"Ключи:"</font> & vbNewLine & _ <font color="teal">"/t<pathto> - Папка, в которую будут перемещаться лог файлы"</pathto></font> & vbNewLine & _ <font color="teal">"/f - Записывать отфильтрованные запросы в базу STATS_SP_WEB_F"</font> & vbNewLine & _ <font color="teal">"/s - Записывать все запросы в базу STATS_SP_WEB"</font> & vbNewLine & _ <font color="teal">"/l<filelog> - Файл для записи подробного журнала"</filelog></font> & vbNewLine & _ WScript.Quit <font color="blue">End</font> <font color="blue">Sub</font>
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д