Нужны идеи о том, как кодировать мой анализатор логов - PullRequest
2 голосов
/ 25 июля 2010

У меня есть VPS, на котором размещено несколько виртуальных хостов.У каждого хоста есть свои собственные access.log и error.log.В настоящее время настройки ротации журналов нет, однако, это может измениться.

По сути, я хочу проанализировать эти журналы для мониторинга пропускной способности и сбора статистики.

Моя идея заключалась в том, чтобы написать анализатор и сохранитьинформация в небольшую базу данных sqlite.Сценарий будет запускаться каждые 5 минут и использовать методы Python seek и tell для открытия файлов журнала из последних проанализированных местоположений.Это мешает мне анализировать файл журнала 10 ГБ каждые 5 минут, когда все, что мне нужно, это новая информация, сидящая в конце (без ротации журналов, помните?).

После некоторой мысли я понял, что все, что яя делаю, беря информацию из файлов журнала и помещая их в базу данных ... Перемещение данных из одного места в другое: /

Так как еще я могу это сделать?Я хочу иметь возможность сделать что-то вроде:

python logparse.py --show=bandwidth --between-dates=25,05|30,05 --vhost=test.com

Это откроет файл журнала для test.com и покажет мне пропускную способность, использованную в течение указанных 5 дней.

Теперь мойВопрос в том, как мне предотвратить анализ данных объемом 10 ГБ, если мне нужны данные только за 5 дней?

Если бы я использовал свою идею сохранения данных журнала в базе данных каждые 5 минут, яможет просто сохранить временную метку Unix дат и вытащить данные между ними.Легко.Но я бы предпочел разобрать файл журнала напрямую.

Ответы [ 3 ]

2 голосов
/ 25 июля 2010

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

Я бы все равно использовал базу данных для хранения данных журнала, но с вашим желаемым временем- разрешение блока (например, удержание полосы пропускания с интервалом в день / час).Еще одним преимуществом использования базы данных является то, что вы можете очень просто выполнять запросы диапазона, как тот, который вы даете в своем примере, и fast .Если у вас есть старые данные, которые вам больше не нужны, вы можете удалить их из базы данных, чтобы сэкономить место.

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

Подводя итог:

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

Если вы не хотите писать собственное решение, возьмитепосмотрите Webalizer , AWStats или выберите инструмент из этого списка .

РЕДАКТИРОВАТЬ:

WebLog Expert также выглядит многообещающе.Взгляните на один из отчетов .

1 голос
/ 25 июля 2010

Извлечение только необходимых 5-дневных данных из большого файла журнала сводится к поиску правильного начального смещения для поиска () файла перед началом анализа.

Вы можете найти эту позицию каждый раз, используя двоичный поиск по файлу: seek() до os.stat(filename).st_size / 2, один раз вызовите readline() (исключая результат), чтобы перейти к концу текущей строки, а затем выполните еще два readline() s. Если первая из этих строк предшествует желаемому времени начала, а вторая - после него, то ваше начальное смещение составляет tell() - len(second_line). В противном случае выполните стандартный алгоритм двоичного поиска . (Я игнорирую угловые случаи, когда искомая строка является первой или последней или вообще отсутствует в файле, но их легко добавить)

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

Это будет намного быстрее, чем разбор всего лог-файла каждый раз, конечно, но если вы собираетесь выполнять много таких запросов, то база данных, вероятно, стоит дополнительной сложности. Если размер базы данных является проблемой, вы можете пойти на гибридный подход, где база данных является индексом для файла журнала. Например, вы можете хранить только байтовое смещение начала каждого дня в базе данных. Если вы не хотите обновлять базу данных каждые 5 минут, вы можете logparse.py обновлять ее новыми данными при каждом запуске.

После всего этого, как уже говорили Пьер и the_void, убедитесь, что вы не изобретаете колесо заново - вы не первый, кому нужна статистика пропускной способности: -)

0 голосов
/ 25 июля 2010

Сохранить последнюю позицию

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

Сохраните первую строку данных

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

Первая строка всегда должна быть уникальной, поскольку у вас есть временная метка.Но не забывайте, что файл журнала, совместимый с W3C, обычно записывает заголовки в начале файла.Таким образом, первая строка должна быть первой строкой данных.

Сохраните только те данные, которые вам нужны

При анализе W3C очень легко прочитать отправленные байты.Разбор будет очень быстрым, если вы сохраните только эту информацию.Сохраните его в своей базе данных, либо обновив существующую строку в своей базе данных, либо добавив новую строку с отметкой времени, которую вы можете объединить с другими позже в запросе.

Не изобретать зановоwheel

Если то, что вы делаете, не является очень конкретным, я рекомендую вам скачать парсер с открытым исходным кодом в Интернете.http://awstats.sourceforge.net/

...