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 первое поле, до первого пробела, имеет вид

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>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы