Запсиь лога в БД.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Запсиь лога в БД.

Сообщение teCa » 26.06.2007 (Вт) 14:35

Собсно вопрос вот в чем.

есть утилита которая пишет данные в логфайл, моя задача организовать запись этих данных в БД.

В принципе все ясно, вижу 2 варианта решения задачи.

1. Считывание ога через заданый интервал времени.
Вопрос: Как токда запоминать откуда начинать читать в следующий раз, лог может чистится итд.

2. Следить за логфайлом и заносить данные а БД не посредственно при попадании их в лог.
Вопрос: Чесно говоря тут я недопредставлю как это реализовать, но наверняка так можно)))

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.06.2007 (Вт) 14:58

Выбрать путь, по которому положатся логи, возможно?
Если да, то создавай трубу и направляй логи в неё.
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 26.06.2007 (Вт) 15:07

ну да, путь куда класть лог файл можно забить в конфиг, а что за труба?

не разу не сталкивался с токим панятием??

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.06.2007 (Вт) 15:25

гугли CreateNamedPipe
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 26.06.2007 (Вт) 16:32

а на VB это фича реалезуется, а то пока только кучу сишного года вижу

и еще, да видел примеры соединения 2х процессов сервер/клиент, но не совсем понял в плане реализации моей задачи, эта утилита будет читать лог? или она будет просто клиентом для утилиты пишущей в лог?

Иле же она будет читать сам логфайл?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 26.06.2007 (Вт) 17:15

teCa
CreateNamedPipe создаст в системе некий объект(труба), который можно открывать как файл(у него даже путь будет). Путь к трубе надо прописать в качестве имени файла для лога, и весь вывод на него пойдёт в трубу. После чего, используя дескриптор трубы, можно это лог прочитать.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.06.2007 (Вт) 19:39

Твоя утилита будет сервером для проги, пишущей в лог.
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 27.06.2007 (Ср) 10:59

Блин, почитал, но не осилил, и решил сделать всетаки обычное считывание с лога.

В итоге получил массив каждый элемент которого содержит в себе строку.

Только что делать дальше?

эту строку мне нужно разнести по полям, те её опять нужно делить?

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 27.06.2007 (Ср) 20:07

И как запомнить с какого места начать писать в следующий раз?

burik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 03.11.2005 (Чт) 22:04
Откуда: Беларусь, Рогачев

Сообщение burik » 27.06.2007 (Ср) 20:15

Может там дата (время) ставится?
Между слухов, сказок, мифов,
просто лжи, легенд сомнений
мы враждуем жарче скифов
за несходство заблуждений
Игорь Губерман

kibernetics
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 945
Зарегистрирован: 03.05.2006 (Ср) 13:31
Откуда: Minsk

Сообщение kibernetics » 28.06.2007 (Чт) 23:55

можешь в крайнем случае хранить глобальную переменную, в которой будет указан офсет на позицию в файле лога. тогда, как только потребуется сливать лог в БД - считываешь свою переменную, смещаешься по файлу, читаешь все строки после офсета, обновляешь переменную с учетом считанного и по новой..
но, в этом случае жизнь переменной ограничена только пока программа работает. поэтому, завершая приложение скидывай значение переменной в ini файл например, или в тот же лог, последней строкой...

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 29.06.2007 (Пт) 0:52

Угу. В тот же лог. Последней строкой. И как ты ее потом оттуда вытащишь??? ,-)
Если уж так - писать в лог комбинацию символов, которая никогда в этом логе не встретися при нормальной работе программы, а потом эту комбинацию искать с конца лога.
А еще лучше просто после занесения лога в базу - его обнулять. Зачем он тебе еще нужен, если его копия уже есть в базе?
label:
cli
jmp label

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 29.06.2007 (Пт) 8:50

Обнулять лог было первой мыслью, однако затем пришла такая мысь что пока лог считывается с открытого файла, файл же не блокируется, соответственно в это время может иди и запись в лог новых данных, затем после считывания с открытой копии обнуляется исходный файл, соответственно все что было занесено в лог в этот промежуток времени теряется?

А может просто считать строки и записывать колличество в ini, а как продолжить считывание с определенной строки?

И как можно посчититать строки в файле?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Сообщение iGrok » 29.06.2007 (Пт) 11:36

Как посчитать строки в файле??? Эээ. Таким вопросом ты меня в тупик поставил. Ну взять, да и посчитать.. В принципе, можно пересчитывать кол-во vbCrLf в файле.

А насчет открытого файла лога.. Что-то мне подсказывает, что большую часть времени лог закрыт. По крайней мере, у большинства программ.
label:
cli
jmp label

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 11:39

teCa, ей-богу, ты в итоге потратишь больше времени и сил, чем на написание трубного сервера.
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 29.06.2007 (Пт) 12:44

Я не пойму просто в чем приимущество трубы?Связь так же будет идти через лог, после даные полученые с трубы мне нужно будет приводить в надлежащий вид, а патом также писать их в базу?

Паправте если не прав, но в логе уже готовые данные.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 12:58

Преимущество в том, что не нужно отслеживать, где конец.
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 29.06.2007 (Пт) 13:03

А как по тексту перемещатася, есть курсор какой?
Можно как определить текущую позицию?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 13:06

Почему ты решил, что после считывания из трубы потребуется более сложное "приведение данных в надлежащий вид", чем после считывания из дискового файла?
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 29.06.2007 (Пт) 13:41

так я проссто разницы большой не наблюдаю?По работе с текстовыми вайлами примеров полно, а по работе с трубой увы.

А все что есть так с моей одной звездочкой в стате без подробных коментов и полулитры не обойтись будет.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 29.06.2007 (Пт) 13:54

То ли не искал, то ли издеваешься.
http://support.microsoft.com/kb/177696
Изображение

teCa
Новичок
Новичок
 
Сообщения: 47
Зарегистрирован: 09.10.2006 (Пн) 10:45

Сообщение teCa » 29.06.2007 (Пт) 14:14

Да причем тут издеваешся, я половины только синтаксиса тут не понимаю, все конечно ясно по поводу век живи век учись.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 29.06.2007 (Пт) 14:23

Для начала понимать не обязательно. Там же полноценный пример, оформил в прогу, запустил, посмотрел что происходит, подумал. Повторил. Просветление наступит.
Лучший способ понять что-то самому — объяснить это другому.

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 07.07.2007 (Сб) 23:04

по моему личному мнению первый вариант самый простой.

Делаешь так:
Берешь БД, вносишь туда параметр LogFileSize
в эту переменную после считывания вписываешь последний размер файла лога, вероятнее всего данные в лог файл вписываются в конец (по идее так и должно быть).

Поэтому НОВЫЕ ДАННЫЕ ты можешь считать если будешь читать файл с позиции LogFileSize + 1 и до конца файла. Кажется вполне логичным что и анализироать тебе потребуется только этот фрагментик, назавем его BUF.
Берешь BUF, разбиваешь на строки tmp=split(BUF,vbCrLf)
ubound(tmp) - это количество строк, ну а tmp - массив с содержанием лога.
и в базу, после чего в базе записываешь LogFileSize = FileLen(LogFilePath).

вроде весь алгоритм.
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Сообщение SSecurity » 07.07.2007 (Сб) 23:26

прочел внимательно и понял что прийдется подробнее написать:

Код: Выделить всё
'## чтение данных из файла (с определенного места)
Dim BUF as String
Dim LogFile as String
Dim tmpBuf as String * 50000
Dim StartPos as Long    '## предыдущий размер считываемого лога
Dim CurFileSize as Long  '## длина лога на момент анализа

'## считываем StartPos из базы, а пока так поставим 0
StartPos = 0   

LogFile = "D:\simple.ini"
CurFileSize = FileLen(LogFile)
NewDataLen = CurFileSize-StartPos   '## длина новых данных
Open LogFile For BINARY as #1
  For I = 0 to Int(NewDataLen / 50000)
    'засовываем сразу 50 000 байт в переменную
    Get #1, StartPos+1+I*50000, tmpBuf
    BUF = BUF + tmpBuf
  Next I
Close #1
'## когда мы считали то что нужно длина BUF будет кратно 50000
'## поээтому нас интересует только NewDataLen первых байт
RealData = Left$(BUF,NewDataLen)
'## разбиваем на строки
Tmp = Split(RealData, vbCrLf)
Print "новых строк: "; ubound(tmp)
For I = 0 to Ubound(Tmp)
  '## строка которая тебе нужна
  NewLine = Tmp(I)   
  '## код засовывания в базу сам напишешь
  '## ... тут
Next I
StartPos = CurFileSize
'## Записываем параметр StartPos в базу.

Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 94

    TopList