Обработка логов Mikrotik shell-скриптом на FreeBSD...

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение Lazy caT » 2009-09-24 17:25:14

Здравствуйте многоуважаемые...

Поднялся у меня тут вопрос как логи с Mikrotik'а обрабатывать в FreeBSD... (Цель-сбор статистики по трафику, и по тому куда ходили через web-proxy)
Настроил я микротик чтобы он у меня логи писал в "remote"...
Syslogd логи принимает скидывает в файл всё ОК... и тут начинаются проблемы...
хочу разобрать эти логи и запихнуть, например, в MySQL... Подготовил соответствующую базу,
начал мастерить скрипт на shell... сделал скрипт:

Код: Выделить всё

#!/bin/sh
# Вводим данные для подключения к MySQL серверу
# IP адрес MySQL сервера
MySQLServer="localhost"
# Имя пользователя для доступа к БД в которой храниться траффик
username="traf"
# Пароль пользователя MySQL
user_passw="traf"
# Имя базы данных
db_name="traflog"

# поехали

# Сегодяшний день
day="`date +%Y-%m-%d`"
# Текущий год
year="`date +%Y`"
# Текущий месяц
month="`date +%m`"

# Местоположение исполняемого файла клиента MySQL
mysql="/usr/local/bin/mysql"
# Префикс для команд (лень же каждый раз набивать параметры подключения)
sql_preffix="${mysql} --host=${MySQLServer} --user=${username} --password=${user_passw} --database=${db_name}"

# Построчно превращаем файл со статистикой в набор переменных
grep "firewall" /tmp/pl_traf.log |
{
while read stroka
do
    # Берем время из лога.
    logtime=`echo "${stroka}" | awk '{print $3}'`

    # Кусок строки лога которую нужно разбирать
    logline=`echo "${stroka}" | awk '{split($0,a,": "); print a[3]}'`
    # Вытягиваем сведения о протоколе
    protocol=`echo "${logline}" | awk '{split($0,a,", "); if (substr(a[2],1,5)=="proto") print a[2]; else print a[3] }' | awk '{print $2}'`
    # Вытягиваем подстроку типа 'адрес:порт->адрес:порт' ....
    tmpline=`echo "${logline}" | awk '{split($0,a,", "); if (substr(a[2],1,5)=="proto") print a[3]; else print a[4] }'`
    # .... и разбираем её на части ....
    src_ip=`echo "${tmpline}" | awk '{split($0,a,"->"); split(a[1],b,":"); print b[1] }'`
    src_port=`echo "${tmpline}" | awk '{split($0,a,"->"); split(a[1],b,":"); print b[2] }'`
    dst_ip=`echo "${tmpline}" | awk '{split($0,a,"->"); split(a[2],b,":"); print b[1] }'`
    dst_port=`echo "${tmpline}" | awk '{split($0,a,"->"); split(a[2],b,":"); print b[2] }'`
    # Вытягиваем данные о колличестве отправленых/полученых байт
    count=`echo "${logline}" | awk '{split($0,a,", "); if (substr(a[2],1,5)=="proto") print a[4]; else print a[5] }' | awk '{print $2}'`

    # Загоняем полученный набор во временную таблицу
    ${sql_preffix} --execute="INSERT INTO \`$db_table\` (\`date\`, \`time\`, \`src_ip\`, \`src_port\`,  \`dst_ip\`, \`dst_port\`, \`proto\`, \`count\`) \
    values ('${day}', '${logtime}', '${src_ip}', '${src_port}', '${dst_ip}', '${dst_port}', '${protocol}', '${count}')"
done
}
# Очищаем файл c логами о том когда и по какому интерфейсу сохранялась статистика
cat /dev/null > /tmp/pl_traf.log


За основу был взят Лисяровский скрипт (отсюда:http://www.lissyara.su/?id=1010) и немного переделан...
сразу хочу заметить что исходные логи несколько не пропорциональны... обычным awk, с лету, и не пропарсишь...
Вот, к примеру:

Код: Выделить всё

Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: input: in:wan out:(none), src-mac 00:20:8f:0a:34:2a, proto 47, 62.5.223.2->81.195.131.123, len 91
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: forward: in:PPTP_FreeBSD out:lan, proto TCP (ACK,PSH), 192.168.23.205:3389->192.168.25.22:1030, len 55
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: forward: in:PPTP_FreeBSD out:lan, proto TCP (ACK,PSH), 192.168.23.205:3389->192.168.25.22:1030, len 55
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: forward: in:lan out:PPTP_FreeBSD, src-mac 00:14:d1:4b:43:58, proto TCP (ACK), 192.168.25.22:1030->192.168.23.205:3389, len 20
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: input: in:wan out:(none), src-mac 00:20:8f:0a:34:2a, proto 47, 62.5.223.2->81.195.131.123, len 12
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: input: in:wan out:(none), src-mac 00:20:8f:0a:34:2a, proto 47, 62.5.223.2->81.195.131.123, len 12
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: output: in:(none) out:lan, proto TCP (ACK), 192.168.25.1:8080->192.168.25.14:1038, len 20
Sep 23 16:42:32 192.168.23.6 firewall,info vlfw_: input: in:wan out:(none), src-mac 00:20:8f:0a:34:2a, proto TCP (ACK), 195.93.180.35:80->192.168.25.1:38398, len 32

так что пришлось вот так вот мудрить...

скрипт работает, только НАСТОЛЬКО ДОЛГО.... мрак... скорость заполнения файла лога порядка 6000-7000 строк в минуту...
а скрипт обрабатывает около 1300 строк за 5 мин...
есть ли шансы как-нибудь ускорить этот процесс, может есть уже готовые решения?....
могу предположить что настолько долгое выполнение связано с постоянными запросами в БД и слишком навороченным методом разбора строки... но увы, что есть... :(

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение ProFTP » 2009-09-24 18:26:41

sh не шарю сильно

можно на perl переписать, там попробовать разные варианты...

самый мощный: многопоточно обработать, для обработки текста сильно помогает, по разному можно сделать, файл разрезать seek и обработать
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
Lazy caT
мл. сержант
Сообщения: 84
Зарегистрирован: 2008-09-11 9:59:17
Откуда: Местные мы...
Контактная информация:

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение Lazy caT » 2009-09-25 7:43:58

ProFTP писал(а):sh не шарю сильно

можно на perl переписать, там попробовать разные варианты...

самый мощный: многопоточно обработать, для обработки текста сильно помогает, по разному можно сделать, файл разрезать seek и обработать


Все бы хорошо но я в perl'е вообще никак :unknown: ... Если бы я его знал - было бы легче...

_adre
проходил мимо

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение _adre » 2014-08-03 17:22:27

Да, на перле норм будет. придётся строгать для иных целей. тоже логи

lazhu
сержант
Сообщения: 176
Зарегистрирован: 2013-08-10 14:28:38
Контактная информация:

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение lazhu » 2014-08-04 12:31:01

Еще бы он работал быстро, когда для каждой строки 10 раз вызывается awk.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение kpp » 2014-08-14 12:32:44

Проблема еще актуальна?
Этот скрипт очень просто переписать на одном AWK.
Работать будет как молния.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 34924
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Обработка логов Mikrotik shell-скриптом на FreeBSD...

Непрочитанное сообщение Alex Keda » 2014-08-17 18:12:23

там, на сайте есть обновлённая статья
про ipacctd, в ней скрипт переписан на perl
Убей их всех! Бог потом рассортирует...


Вернуться в «SHELL»

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость