Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обработка лог-файла на C++ (http://forum.oszone.net/showthread.php?t=29896)

Guest 09-03-2004 16:40 206226

Здравствуйте, у меня такая вот просьба... можете боле-менее подробно описать схему открытия .log файлов и чтения из них данных в Borland C++, как это сделать?

hasherfrog 10-03-2004 08:54 206227

Очень туманно задан вопрос. Ответ такой же туманный: открываешь и читаешь.
Если серьезно, я сейчас пишу класс (на QT), который читает в реал-тайме подновляющиеся клиентские логи. Вся фишка в том, чтобы держать лог-файл открытым на чтение и помнить, где в последний раз был указатель конца файла, чтобы не перечитывать все содержимое заново. Другая фишка в том, что клиенты, пишущие в логи, должны открывать их по "a+" и обязательно пользоваться fflush() . Но это моя специфика. Что конкретно Вас интересует?

Guest 10-03-2004 09:00 206228

hasherfrog
если честно, то в cpp я новичок, но мне нужно просто сделать обработчик лог-файлов, а для этого их нужно соответственно считать. Скорее вопрос сейчас у меня встает в том, что как лучше его обработать в Borland C++, при помощи VCL.
А насчет обновляемых клиентских логов это ты классно, когда можно будет поюзать первые релизы? :)

hasherfrog 10-03-2004 09:56 206229

Еще уточню вопрос. Речь идет о формате лог-файла? Так это очень специфично. В самом общем (и наиболее распространенном) варианте,  лог - просто текстовый файл, в котором каждая строка соответствует сообщению (строка - значит заканчивается "\n"). Т.о. считывание лог-файла превращается в простое последовательное считывание строк из файла, вплоть до конца файла. Воспользуйтесь стандартными средствами Borland по работе с файлами/потоками (я давно не писал на Borland C++, все больше QT, ну или MVS, поэтому не помню, как эти классы называются - какой-нибудть CTextSteram), или  просто fgets().
Что касается "обработки с помощью VCL", я так подозреваю, тебе нужно просто вывести содержимое в раскрашенном виде? Используй CListView (так, по-моему он называется), где для каждой считанной строки предварительно определи значок и цвет (по содержимому строки).  Например, если строка начинается со слова "Warning", покрась ее в оранжевый цвет и прицепи какую нибудь иконку с восклицательным знаком.

Guest 11-03-2004 01:15 206230

Я сейчас тоже пишу анализатор лога (VC 6.0) и запись его в html
делается вроде не сложно.
например мне нужно цветом выделить [user: guest]
я ищу '[', и при условии, что, например,  следующий символ 'u' а символ+5 == ':' я считываю в память строку, пока не встречу ']'

короче,
что то типа:

if(szFileBuf[dwCurrentByte] == '[' && szFileBuf[dwCurrentByte+3] == '/')
{
int tiCount = 0;
while(szFileBuf[dwCurrentByte] != ']')
{
szTime[tiCount] = szFileBuf[dwCurrentByte];
dwCurrentByte++; tiCount++;
}


очень приближенно....

есть наверное и другие методы, но мне влом было думать как сделать и я решил сделать немного по-детски
а вообще если ты на билдере пишешь, есть такие вещи как TRegExp - с помощью этого можешь пропарсить любую строку.

suxxl 11-03-2004 01:38 206231

Да, если б конкретнее вопрос задал может я б и не так ответил

Guest 11-03-2004 11:15 206232

мне надо написать анализатор лога для  WinRoute, там логи идут таким макаром:

ip host метод дата запрос код_ответа входящий_траффик

Маза в том, что мне надо подсчитать суммарный, по хостам, по йапи и т.д.
Я попытался сделать след. образом:
в главном меню есть опция "загрузить лог", он его открывает на чтение, я его прогоняю scanf() считаю траффик, вывожу отчет. Ну там есть еще опция "вывести только по одному IP" и идет лист из чекбоксов, как его заполнить... хз.
Я не прошу вас за меня все это писать... мне бы было интересно как получше все это делать... может быть в базу данных занести? хотя 250 мегов не хилый размер для Celeron 533.

Я в недоумении... помогите плиз.

Prisoner 11-03-2004 22:20 206233

Цитата:

вывести только по одному IP
Имеется ввиду вывести суммарный траффик для конкретного ипа?
Тогда проходим по всему логу (можно скажем на какую-то дату, но это уже нюансы), фиксируем все уникальные ипы и генерируем список из чекбоксов. Кнопка просмотреть будет иметь обработчик который по чекбоксам будет знать какие ипы ему выводить в итоге.
На самом деле лучше наверное просто вывести несколько Edit'ов в которые можно ввести один из четырех (или шести) чисел которые составляют ип и рукодствоваться для вывода уже этими данными...

suxxl 12-03-2004 00:02 206234

ну не знаю... в VC есть специальный "Edit" так и называется IP-Adress ;)

Prisoner 12-03-2004 01:18 206235

Хорошо если так (я Delpher), но это нюансы.

Guest 15-03-2004 10:32 206236

Цитата:

Тогда проходим по всему логу (можно скажем на какую-то дату, но это уже нюансы), фиксируем все уникальные ипы и генерируем список из чекбоксов.
скажите, а как пройтись по логу то? :)

suxxl 15-03-2004 14:54 206237

ты побайтово читаешь или построчно?

Guest 16-03-2004 18:20 206238

suxxl
я пока что еще никак не читаю :)
но нужно построчно.
вопрос:
как прочитать построчно файл и выдрать из него переменные?

Prisoner 16-03-2004 22:32 206239

Guest, а вам не приходила мысль почитать документацию, справочки, порыть в Сети, помучить поисковые системы? Так будет быстрее, а сейчас пусть вам и опишут всю задачу, в следующий раз в голове ничего не будет для решения новой. Так не бывает, обучение это в первую очередь желание узнать и узнать самому.

suxxl 20-03-2004 02:15 206240

блин.... пока не встретил \n читай в память. ты вообще слышал про книги что-то?

Guest 21-03-2004 18:10 206241

Цитата:

оффтопик: Guest, а вам не приходила мысль почитать документацию, справочки, порыть в Сети, помучить поисковые системы? Так будет быстрее, а сейчас пусть вам и опишут всю задачу, в следующий раз в голове ничего не будет для решения новой. Так не бывает, обучение это в первую очередь желание узнать и узнать самому
Вся проблема в том, что я рыскал по сети и читал доки. Перелопатил кучу доков, но никак не могу воткнуть как мне сделать нужное. Примерно алгоритм чтения построчно я написал но к моему великому сожалению, винт убился и исходники пропали, я решил пройтись по новой, но половины ссылок я уже не помню. И никак не получается построчно прочитать файл, хотя уже такое я делал. Алгоритм работы примерно такой:
Тыкаем кнопку Load по событию происходит выхов диалога с выбором файла, когда вносится файл, в поле TMemo парсятся данные при помощи scanf, они суммируются, и в конце выводится список по посещенным сайтам, по кол-ву траффика, этот отчет можно сохранить в текстовый файл.
Реализовать этот механизм на C, я смогу, но насколько я знаю, библиотека борланда отличается, поэтому я и попросил Вас (All) помочь мне. Подскажите пожалуйста примерный код, который должен обрабатывать файл, или дайте ссылку на хорошую документацию.
Цитата:

блин.... пока не встретил \n читай в память. ты вообще слышал про книги что-то?
хе-хе, умно :)

Заранее благодарен :)

hasherfrog 22-03-2004 09:38 206242

Вот ведь незадача какая. Мне очень не хочется ни хвалиться, ни дразниться... Я уже давно все написал и использую... Но Я НЕ МОГУ привести здесь свой класс (на самом деле их уже 2 - визуальный со всякими фильтрами и общий для расчета статистик). Дело не только в том, что жаба душит. Я просто не могу. Дать текст полностью - так я ж работаю на дядю. Частично - будет ни фига не понятно. Sorry. Давайте  Вы спросите что конкретно у Вас не получается - тогда все дружно помогут. А так ничего хорошего не выйдет.

Что же касается последнего вопроса, вот примерный код.
Код:


QTextSteram * pContent = new(&File);
...
 while(!pContent->atEnd()) {
...
QString strLine = m_pContent->readLine(); <- Считанная строка. Анализируйте ее содержимое, добавляйте в TMemo, или чего там еще
...
}
...
delete pContent;

Тперерь относительно реализации на Borland С++. Еоли Вы можете реализовать этот механизм на С, то реализуйте. Там (в C без плюсов) классов не будет и проблем с реализацией тоже не будет. А особенности Borland C++ вылезут только при визуализации.
Удачи.

suxxl 23-03-2004 01:11 206243

2hasherfrog

чем хвалиться?
сложностей тут никаких вроде...


Время: 03:49.

Время: 03:49.
© OSzone.net 2001-