powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
22 сообщений из 22, страница 1 из 1
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36861265
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Необходимо:
VBS обработчик текстовых логов, который умеет вставлять полученные данные, из лог-файлов, в Oracle.

Имеется:
- лог-файлы такого типа: "ex10091011.log" (создан сервером 10.09.2010, с чего следует, что в имени файла сначало стоит год, месяц, число, и "11" - время, когда был создан лог в часах), которые находятся в определенной папке (к примеру С:\Logs\)
- в каждом из этих файлов первые 4 строки считывать ненужно (Там находится информация за знаком "#" о том, что это за лог, и кто его создал, и какие поля он в себе содержит через разделитель пробел)

Вот и само содержание лог-файла:
Код: plaintext
1.
2.
3.
4.
5.
#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, но как описать нужные мне поля?Создать временный файл и записать построчно все поля, разделенные в каждой строке пробелом, что нужны мне и сделать запрос в базу, но как это сделать максимально безболезненно?
Если позволите я выложу где я "хожу" вокруг да около, а вы если не сложно подскажите практическими примерами что да как...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
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 & ")")

Код с ошибками, "возможно" специальными... Это сделанно с целью отсеивания ответов вида: "да зайди в гугл там все есть", "учите матчасть" и т.д. и т.п.
Мне нужны практические примеры!

З.Ы. Человек который дельно поможет не останется без материального "Спасибо"! ;)
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36861580
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посторонние размышления...

MSSQL сервер позволит затянуть такие данные в таблицу непосредственно из текстового файла, описав распределение по полям и типы данных средствами импортера.
С Ораклом не работал, но, насколько знаю, он не уступает MSSQL по функционалу, то есть такие средства там тоже должны быть. То, что это будет на пару порядков быстрее для такого объемного файла (который обычно представляют собой логи трафика) - факт.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36861672
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот это
if (count > 13) Then
непонятно, зачем. Лог может плавать?
Ну и первые 4 строки ведь не нужны - тогда
Do Until idx <> 4
вероятно надо.
Ещё можно построчно читать
lastString = objTextFile.Readline 'читаем посторочно
но тогда в Вашем случае надо дополнительно анализировать начало строки или номер строки.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862302
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Progressive,

Вообще, честно говоря, не очень понятно, в чем вопрос, если использовать ваш код, а не стандартный импортер:
Ну очевидно, что инициализационные процессы с базой должны быть до начала цикла, а строка "INSERT INTO...." внутри цикла (там где у вас вопрос про какую-то переменную i, которой в коде нет) - но это, полагаю, те "намеренные" ошибки, которые вы внесли.
Если правильно расположить вставку в БД - по идее этот код должен работать.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862308
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro по идее этот код должен работать.
Разумеется, как сказал Хьюго, читать файл надо построчно, зачем грузить жуткие мегабайты в память одним махом?
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862816
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе все проблемы решил кроме одной.
Нужен СкипЛайн который будет игнорировать строки начинающиеся на знак "#"

Пока добился пропускание строк обычным text.SkipLine

Вот собственно и код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
Dim FSO, file, fileName
fileName = "D:\A-MAIN\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
text.SkipLine
text.SkipLine
text.SkipLine
text.SkipLine
stringArray = Split(text.ReadAll, Chr( 13 ), - 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_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 >  5 ) Then
      data = parsing( 0 )
      time = parsing( 1 )
      cs_method = parsing( 2 )
      cs_uri_query = parsing( 3 )
      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 )

      Set OraSession = CreateObject("OracleInProcServer.XOraSession")
      Set OraDatabase = OraSession.OpenDatabase("oracle.test", "testUser/testPass",  0 )
      OraDatabase.ExecuteSQL("ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '.`'")
      sql = "INSERT INTO STATS_SITE VALUES ( to_date('" & data & " " & time & "', 'yyyy-mm-dd hh24:mi:ss'),'" & cs_method & "', '" & cs_uri_query & "', '" & s_port & "', '" & c_ip & "', '" & cs_host & "', '" & sc_status & "', '" & sc_substatus & "', '" & sc_bytes & "', '" & cs_bytes & "', '" & time_taken & "')"
      OraDatabase.ExecuteSQL(sql)
    End If

  End If
  idx = idx -  1 
Loop

Кстати с построчным считыванием тоже сижу думаю как лучше сделать...
Может что посоветуете? Считывание текстового файла должно начатся с первой строки но с исключением знака "#", тобишь если строка начинается на символ "#", то она не обрабатывается а просто пропускается (Skip or SkipLine).
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862913
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чем проблема-то?
Прочитать строку, LEFT-ом проверить первый символ, если он "#", просто не сплитить и не писать ее в базу, а переходить к следующей.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862957
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А зачем Dim data и т.д. внутри цикла? Оно и так примет значения из массива, зачем лишний раз обнулять? Строк то ведь не 10 - заметно время занимает.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36862963
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Читаем построчно:
Do While objTS.AtEndOfStream <> True
tempStr = objTS.ReadLine()
objOTS.Write Replace(tempStr,".","-") & "/" & tempStr & vbCrLf
Loop
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36863496
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну в принципе более менее вопрос решен...
А вы не подскажите как обрабатывать все лог-файлы которые находятся в папке по очереди, там по дате создания например или другому атрибуту?
К примеру есть папка Temp а в ней штук 30 файлов разришения *.log и во всех одинаковая структура, само собой!

Вот названия к примеру:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
ex10092008.log
ex10092009.log
ex10092010.log
ex10092011.log
ex10092012.log
ex10092013.log
ex10092014.log
ex10092015.log
...
ex10092023.log
ex10092100.log
ex10092101.log
ex10092102.log
ex10092103.log

Вот такой вид будет файлов в папке. И вот как бы каждый обработать этим скриптом что я написал. Не будешь жеш менять ручьками название лог-файла в скрипте каждый рас...
Кто что думает по этому поводу?
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36863506
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Progressive,
вот пример перебора файлов именно vbs-скрипт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
'Удаление файлов XLS если они старше 10 дней 
Dim FSO, WSH
Dim TheFolder, TheFiles, AFile
Set WSH = CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TheFolder = FSO.GetFolder("C:\!WORK!\") 'Каталог, откуда удалять
Set TheFiles = TheFolder.Files
'msgbox "I Delete Old EXCEL files!"
For Each AFile In TheFiles
    If UCase(FSO.GetExtensionName(AFile.Path)) = "XLS" and _ 
        DateDiff("d", AFile.DateLastModified, Date) >  10   Then
        AFile.Delete
    End If
Next
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36877630
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что ж друзья держите еще некоторые доработки.
- добавил логирование работы самого скрипта с перезаписю лога при каждом новом запуске
- поменял структуру скрипта, для удобства чтения

ВНИМАНИЕ! Вопросы:
№1 - как правильней написать функцию удаления обработанных файлов, при условии что запрос в БД прошел успешно
№2 - как исключить из считывания лог-файла целую строку что начинается на знак "#", пробовал и Left'ом , но при этом ругается на UBound(неправильный тип переменной stringArray).

Сам код: (он рабочий, но вот нужно усовершенствовать)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
del_vbslog = True
files_move = True
log_reader = True
Dim SourceFolder, pathTo, idx, file, FSO, FileLog
SourceFolder = "D:\Temp&logs\WebLogFiles\W3SVC1"
pathTo = SourceFolder + "\Export_To_Oracle"
Set FSO = CreateObject("Scripting.FileSystemObject")
FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)- 4 )) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"

Main()
'-----------------------------------------------------------
Sub Main()
  If del_vbslog Then DelVbsLog()
  If files_move Then LogFilesMove()
  If log_reader Then LogReader()
End Sub

'-----------------------------------------------------------
'Удаляем лог-файл нашего скрипта, если таковой существует
Sub DelVbsLog()
  If FSO.FileExists(FileLog) Then
    Set File = FSO.GetFile(FileLog)
    Const DELETE_FILE_FORCE = True
    File.Delete DELETE_FILE_FORCE
  End If
End Sub
'-----------------------------------------------------------

'-----------------------------------------------------------
'Перемещаем лог-файлы в папку Export_To_Oracle
Sub LogFilesMove()

If Not FSO.FolderExists(pathTo) Then
    FSO.CreateFolder pathTo
End If
On Error Resume Next
WriteLog("Перемещены\скопированы следующие файлы: " & vbCrLf)
For Each File In FSO.GetFolder(SourceFolder).Files
    path_to_file=pathTo & "\" & File.Name
    if FSO.FileExists(path_to_file) then FSO.DeleteFile(path_to_file)
    FSO.MoveFile File.Path, path_to_file
    If Err.number <>  70  Then Log_Ok_Or_ErrorAndQuit 'исключаем ошибку если файл занят другим процессом
    WriteLog(path_to_file)
Next
End Sub

Sub Log_Ok_Or_ErrorAndQuit
    If Err.number <>  0  Then
        WriteLog "Error #" + Err.number + " :" + Err.Description,  1 
        WScript.Quit
    End if
End Sub

'-----------------------------------------------------------
'Обрабатываем каждый лог-файл и производим запись в БД
Sub LogReader()

Dim TheFolder, TheFiles, fileName
Set TheFolder = FSO.GetFolder(pathTo)
Set TheFiles = TheFolder.Files

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase("oracle.test", "root/password",  0 )
OraDatabase.ExecuteSQL("ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '.`'")

For Each fileName In TheFiles

  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)

  WriteLog(vbCrLf & "Был обработан файл: " & vbCrLf & fileName)
  
  Dim stringArray, lastString
  text.SkipLine
  text.SkipLine
  text.SkipLine
  text.SkipLine
  stringArray = Split(text.ReadAll, Chr( 13 ), - 1 ,  1 )
  text.Close

    WriteLog(vbCrLf & "Выполнены следующие действия: ")
  idx = UBound(stringArray)
  isRunCommit = false
  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, sc_status, sc_substatus, sc_bytes, cs_bytes, time_taken, parsing, count
      parsing = Split(lastString, " ")
      count = UBound(parsing)
      
      if (count >  5 ) 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 )
        sc_status = parsing( 7 )
        sc_substatus = parsing( 8 )
        sc_bytes = parsing( 9 )
        cs_bytes = parsing( 10 )
        time_taken = parsing( 11 )

        if cs_uri_query = "-" Then 'если вместо данных прочерк, то заменяем на пустоту. У вас может такого не быть, либо встречатся другой символ
          cs_uri_query = ""
        End if

        sql = "INSERT INTO STATS_SITE VALUES ( to_date('" & data & " " & time & "', 'yyyy-mm-dd hh24:mi:ss'), '" & cs_method & "', '" & cs_uri_stem & "', '" & cs_uri_query & "', '" & s_port & "', '" & c_ip & "', '" & sc_status & "', '" & sc_substatus & "', '" & sc_bytes & "', '" & cs_bytes & "', '" & time_taken & "')"
        OraDatabase.ExecuteSQL(sql)
        isRunCommit = true
        WriteLog(vbCrLf & sql)
      End If
    End If
    idx = idx -  1 
  Loop
  if isRunCommit = True Then
  'file.Delete 'как бы удаление файла после удачной обработки и добавления в базу
  'OraSession.CommitTrans
  end if
Next
End Sub

'-----------------------------------------------------------
'Функция записи лог файла

Function WriteLog(Text)
   Const ForReading =  1 , ForWriting =  2 
   Dim f
   
  Set f = FSO.OpenTextFile(FileLog,  8 , True)    
    f.Write Text & vbCrLf
    f.Close
   
End Function
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36878138
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Progressive,
№2 - как исключить из считывания - но Вы ведь уже всё прочитали в ReadAll.
Имхо теперь только выкидывать из обработки:

if Len(lastString) > 0 and left(laststring,1)<>"#" Then
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36879977
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hugo121Progressive,
№2 - как исключить из считывания - но Вы ведь уже всё прочитали в ReadAll.
Имхо теперь только выкидывать из обработки:

if Len(lastString) > 0 and left(laststring,1)<>"#" Then

А я так делал, не выкидывает с обработки :(
Делаю в режиме отладки и вижу как целая строка типа:
#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

Не пропускается, а обрабатывается спокойно, как будто никто ее и не ограничивал... Может необходимо задать код символа "#" ? Правда я ее не знаю)))

Пробовал построчное считывание вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Do While text.AtEndOfStream <> True
stringArray = text.ReadLine
  If Left(stringArray,  1 ) <> "#" Then
    stringArray = Split(text.ReadAll, Chr( 13 ), - 1 ,  1 )
  End If
Loop

Но таким образом считывает только последнюю строку из файла и все!
Но таким методом он хоть видит что строка начинается на "#" и пропускает ее...

:(
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881361
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Progressive, возможно, когда Вы делаете
stringArray = Split(text.ReadAll, Chr(13), -1, 1)
то другие символы конца строки приклеиваются в начало следующей строки.
Выведите в дебуг
mid(lastString,1,1)
mid(lastString,2,1)
mid(lastString,3,1)
где там это # лежит?
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881364
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
или так попробуйте бить
Код: plaintext
1.
stringArray = Split(text.ReadAll, vbnewline)
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881425
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881429
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего только люди не придумают, чтобы Перл не учить.
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881528
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проставляем в Test.vbs путь к файлу MyLogFile.txt и запускаем:
Код: plaintext
CScript Test.vbs
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881530
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то архивчик не вставился...
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36881623
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hugo121или так попробуйте бить
Код: plaintext
1.
stringArray = Split(text.ReadAll, vbnewline)


Вот оно! Как я мог упустить этот момент :(( ... Вы абсолютно правы! Спасибо огромное. Теперь все работает :)

Я вот кстати что подумал, а если название папки где лежат логи переименуется, то тогда обработчик не сработает, надо бы проработать этот момент... Может написать функцию что-то типа поисковика нужного типа лог-файлов, или задавать путь посредством командной строки в самом vbs-нике...Как считаете?
...
Рейтинг: 0 / 0
VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
    #36887310
Progressive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот рабочий скрипт.
Может кому понадобится. Данный скрипт я вкидываю в менеджер автозапуска и он по заданным параметрам в командной строке выполняет все операции. Поэтому и поубирал все строгие привязки к файлам и папкам.

Может кто напомнит как вывести в командной строке все выполняемые операции скрипта? Вывод конечного результат это понятно, просто вывести лог файл, а вот именно отображения процесса, аля "Выполнено Х%".

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
' Для запуска скрипта пропишите в командной строке: cscript D:\A-MAIN\test.vbs D:\A-MAIN\INOUT /tD:\A-MAIN\123 /lD:\A-MAIN\test.log
del_vbslog = True
files_move = True
log_reader = True
Check_Conditions = True
query_sql = True
query_sql_f = True
Dim SourceFolder, pathTo, idx, file, FSO, FileLog, OutToEvLog
Dim ws: Set ws = CreateObject("WScript.Shell")
OutToEvLog = False
SourceFolder = ""
pathTo = ""
Set FSO = CreateObject("Scripting.FileSystemObject")
FileLog = Left(WScript.ScriptName,(Len(WScript.ScriptName)- 4 )) & "_" & DatePart("yyyy",Date) & "_" & DatePart("m",Date) & "_" & DatePart("d",Date) & "." & "log"
Main()
'-----------------------------------------------------------
Sub Main()
  If Check_Conditions Then CheckConditions()
  If del_vbslog Then DelVbsLog()
  If files_move Then LogFilesMove()
  If log_reader Then LogReader()
End Sub

'-----------------------------------------------------------
'Удаляем лог-файл нашего скрипта, если таковой существует
Sub DelVbsLog()
  If FSO.FileExists(FileLog) Then
    Set File = FSO.GetFile(FileLog)
    Const DELETE_FILE_FORCE = True
    File.Delete DELETE_FILE_FORCE
  End If
End Sub
'-----------------------------------------------------------

'-----------------------------------------------------------
'Перемещаем лог-файлы в папку Export_To_Oracle
Sub LogFilesMove()

If Not FSO.FolderExists(pathTo) Then
    FSO.CreateFolder pathTo
End If

'Удаляем все файлы что находятся в папке pathTo
Dim FileList, AFile
Set Folder = FSO.GetFolder(pathTo)
Set FileList = Folder.Files
For Each AFile In FileList
        AFile.Delete
Next

On Error Resume Next
WriteLog("Перемещены\скопированы следующие файлы: " & vbCrLf)
For Each File In FSO.GetFolder(SourceFolder).Files
    path_to_file=pathTo & "\" & File.Name
    if FSO.FileExists(path_to_file) then FSO.DeleteFile(path_to_file)
    FSO.MoveFile File.Path, path_to_file
    If Err.number <>  70  Then Log_Ok_Or_ErrorAndQuit
	WriteLog(path_to_file)
Next
End Sub

Sub Log_Ok_Or_ErrorAndQuit
    If Err.number <>  0  Then
        WriteLog "Error #" + Err.number + " :" + Err.Description,  1 
        WScript.Quit
    End if
End Sub

'-----------------------------------------------------------
'Обрабатываем каждый лог-файл и производим запись в БД
Sub LogReader()

Dim TheFolder, TheFiles, fileName
Set TheFolder = FSO.GetFolder(pathTo)
Set TheFiles = TheFolder.Files

Set OraSession = CreateObject("OracleInProcServer.XOraSession")
Set OraDatabase = OraSession.OpenDatabase("oracle.test", "test/pass",  0 )
OraDatabase.ExecuteSQL("ALTER SESSION SET NLS_NUMERIC_CHARACTERS= '.`'")

For Each fileName In TheFiles

  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)

  WriteLog(vbCrLf & "Был обработан файл: " & vbCrLf & fileName)
  
  Dim stringArray, lastString
  stringArray = Split(text.ReadAll, vbnewline)
  text.Close

  WriteLog(vbCrLf & "Выполнены следующие действия: ")
 idx = UBound(stringArray)
  isRunCommit = false
  Do Until idx <  0 
    lastString = stringArray(idx)
    if Len(lastString) >  0  and left(laststring, 1 )<>"#" Then
      Dim data, time, 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, " ")
      count = UBound(parsing)
      if (count >  5 ) 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 )
        sc_status = parsing( 7 )
        sc_substatus = parsing( 8 )
        sc_bytes = parsing( 9 )
        cs_bytes = parsing( 10 )
        time_taken = parsing( 11 )

		if query_sql Then
        if cs_uri_query = "-" Then
          cs_uri_query = ""
          else
          cs_uri_query = Replace(cs_uri_query, "'", "'||chr(39)||'")
        End if

        sql = "INSERT INTO STATS_SP_WEB VALUES ( to_date('" & data & " " & time & "', 'yyyy-mm-dd hh24:mi:ss'), '" & cs_method & "', '" & cs_uri_stem & "', '" & cs_uri_query & "', '" & s_port & "', '" & c_ip & "', '" & sc_status & "', '" & sc_substatus & "', '" & sc_bytes & "', '" & cs_bytes & "', '" & time_taken & "')"
        OraDatabase.ExecuteSQL(sql)
        isRunCommit = true
        WriteLog(vbCrLf & sql)
		End if
		
		if query_sql_f Then
        'Отфильтровуем полученные строки и записываем в БД №2
        if Right(cs_uri_stem,  4 ) = "ashx" or Left(cs_uri_stem,  9 ) = "/Services" Then
		    sql_f = ""
		      else
			    sql_f = "INSERT INTO STATS_SP_WEB_F VALUES ( to_date('" & data & " " & time & "', 'yyyy-mm-dd hh24:mi:ss'), '" & cs_method & "', '" & cs_uri_stem & "', '" & cs_uri_query & "', '" & s_port & "', '" & c_ip & "', '" & sc_status & "', '" & sc_substatus & "', '" & sc_bytes & "', '" & cs_bytes & "', '" & time_taken & "')"
			    OraDatabase.ExecuteSQL(sql_f)
			    isRunCommit = true
			    WriteLog(vbCrLf & sql_f)
		End if
		End if
		
      End If
    End If
    idx = idx -  1 
  Loop
Next
End Sub

Sub CheckConditions
  dim i, s, sLen, strKey, strValue, strErrors
  Set Args = WScript.Arguments
  If Args.Count <  1  then ShowHelp
  strErrors = ""
  SourceFolder = Args( 0 )
  For i =  1  to Args.Count -  1 
    s = Args(i)
    sLen = Len(s)
    strKey = Left(s,  2 )
    If sLen >  1  Then strValue = Right(s, Len(s) -  2 )
    On Error Resume Next
    If strValue = "" Then Err.Raise vbObjectError +  2 , "Наличие значения обязательно. Неправильно указан параметр"
    Select Case strKey
             Case "/t" pathTo = strValue
	  Case "/f" query_sql = sql_f
	  Case "/s" query_sql_f = sql
	  Case "/l" FileLog = strValue
      Case Else
        Err.Raise vbObjectError +  1 , WScript.ScriptFullName, "Ошибка в параметрах командной строки"
    End Select
  Next
End Sub

'-----------------------------------------------------------
'Функция записи лог файла
Sub WriteLog(Text)
   Const ForReading =  1 , ForWriting =  2 
   Dim f
   
  Set f = FSO.OpenTextFile(FileLog,  8 , True)
	f.Write Text & vbCrLf
	f.Close 
End Sub

Sub ShowHelp
  WScript.Echo "Usage: " & WScript.ScriptFullName & " <Путь> [<Ключи>]" & vbNewLine & _
    "<Путь> - Папка, в которой лежат логи" & vbNewLine & _
    "Ключи:" & vbNewLine & _
    "/t<pathTo> - Папка, в которую будут перемещаться лог файлы" & vbNewLine & _
    "/f - Записывать отфильтрованные запросы в базу STATS_SP_WEB_F" & vbNewLine & _
    "/s - Записывать все запросы в базу STATS_SP_WEB" & vbNewLine & _
    "/l<FileLog> - Файл для записи подробного журнала" & vbNewLine & _
  WScript.Quit
End Sub
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBS:Обработчик текстовых логов, вставка полученных данных в Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]