ADS 468x60

2011-11-04

Парсим логи ProxySG часть 1.

Как-то я столкнулся с проблемой получения актуальной информации, использования ресурсов Интернет работниками компании. Не так давно компания приобрела очень гибкое решение по контролю использования Интернет от компании Blue Coat Systems Inc.

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

Данный продукт поставляется уже как готовое решение, собственного формата база данных, модифицированная *nix ОС, доступ к настройкам, которых осуществляется только через веб.

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

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

Задача была такая:
1. Выбрать всех кто в рабочее время пользуются ресурсами Интернет, исключив обед.
2. Выбрать все сайты подпадающие под категории развлекательного содержания (было взято несколько стандартных категорий).
3. Убрать весь мусор который набивает статистику пользователя.
4. Учетные записи привязать к подразделениям.
5. Перевести потраченное время в деньги.

Разобравшись в настройках было выяснено, что с определенной периодичностью (которая задается при настройке и может быть потом изменена) сенсор сбрасывает всю накопленную информацию (пройденную через него) для последующей обработки в файл текстового формата с расширением *.log. После обработки и заполнения собственной БД, система удаляет или архивирует файл с расширением *.gz.

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

Файл текстового формата представляет собой весь перечень информации о пользователе, разделенный каким-то параметром, допустим “;” (дата; время; логин; домен; IP адрес пользователя; IP адрес сайта; URL; URL перехода ...). Сжатый файл размером 100мб, в распакованном виде 1.3Гб. Архивов за 20 дней набирается до 30гб, места для распаковки таких объемов конечно нет, что делать?

В процессе решения данных задач, совместно с колегами, было разработано и протестированною три варианта, в процессе работы варианты все время модифицировались и совершенствовались:

Вариант 1.
Данный вариант основывается на обработке всех файлов с помощью программы zgrep - это grep но умеющий работать с архивными файлами.
Вариант 2.
PHP скрипт, работающий совместно с grep. Данный метод состоит из загрузки архива, распаковки, обработки по условию/параметру, записи в файл, удаление архива и файла, повторение процедуры с следующим архивом.
Вариант 3.
Perl скрипт, выполняющий подобные действия описанные в втором варианте.

Самым быстрым методом по обработке такого количества данных оказался Вариант 1, но в процессе выполнения поставленных задач приходилось использовать все варианты.

Решение задачи №1 и №2.
Чтоб не тратить время на обработку двух условий отдельно (рабочее время и категории) мы решили объединить данные задачи в одну. Архивные файлы, в своем названии содержат дату и время, но точно выбрать рабочее время с 9 до 18 исключив обед не возможно, т.к. файл пишется до полного заполнения (этот параметр может меняться в настройках).

В решении данной задачи, использовали zgrep и grep с файлами образцов.
Первый файл образца содержал дату и время.
Пример файла образцов “Data”.
“2011-10-10 9:”
“2011-10-10 10:”
Второй файл образца содержал категории развлекательного содержания.
Пример файла образцов “Category”.
“Games”
“Social Networks”
“Audio/Video”

Команда выглядела так:

“zgrep -f ./Data //10.1.1.1/BACKUP/SG_201110*.gz pars_data.txt && grep -f ./Category pars_data.txt all_pars_data_and_cat.txt”
Это примитивный метод, последовательно выполняются две команды, результат успешного выполнения первой команды передается второй.
Позже был написан Bash скрипт выполняющий три задачи.

В файле all_pars_data_and_cat.txt находится информация соответствующая файлам образца.

Решение задачи №3, будет описано в следующей статье.

0 comments:

Post a Comment

Популярне за тиждень