Обсуждение статьи тематического каталога: Подсчет трафика проходящего через Squid используя MySQL (squid traffic mysql isp nilling linux)Ссылка на текст статьи: https://www.opennet.ru/base/net/squid_trafic.txt.html
Идея чудесная -- только лог лучше парсить по мере поступления. Доходим до EOF, ждём несколько секуд, сбрасываем состояние ошибки и читаем снова.
Можно проверить иноду файла (вдруг он ротировался). Вот исходник:int log_getc(void)
{
int c, counter=0;
for(;;) {
c = fgetc(log);
if(c == EOF) {
if(counter > 60) {
struct stat b;
if(stat(log_file,&b) != 0) {
char errmsg[1024];
sprintf(errmsg, "stat %s: %s", log_file, strerror(errno));
fatal_error(errmsg);
}
else {
if(log_inode != b.st_ino)
fatal_error("Log rotated");
}
counter = 0;
}
else {
sleep(30);
counter++;
clearerr(log);
}
}
else return c;
}
}Полный текст утилитки (только для postgres'а) дарю попросившему почтой ;)
>Идея чудесная -- только лог лучше парсить по мере поступления. Доходим до
>EOF, ждём несколько секуд, сбрасываем состояние ошибки и читаем снова.
>Можно проверить иноду файла (вдруг он ротировался). Вот исходник:прощу прощения, я не программирую на C/C++. ваша утилитка для моего случая - рабочая? и как ей пользоваться?
А я для этих целей крутить на С не стал, и сделал
tail -n 1 -f /var/log/squid/access.log | gawk ........
а в gawk добавляю данные в mysql по мере поступления.PS Кстати, кроме поля с url, я добавляю поле с именем сервера (выдергиваю из url). Сделал только недавно, еще не оценил насколько оно надо, но кажется что группировка по имени сервера дает красивые (наглядные) резуьтатаы.
Интересно!
Пришли утилитку почтой.
А то давно пытался под postgres трафик перевести
Только после того как отработает скрипт, мы начнем терять данные. В файле access.log будет тишина. IMXO надо так:
#!/bin/bash
squid -k rotate
sleep "несколько секунд"
cp /www/logs/squid/access.log.0 /tmp/squidforparse.log
awk '{print "INSERT INTO squid (ip,bytes,link,trans,time) VALUES(\""$3"\","$5",\""$7"\",\""$9"\",from_unixtime("$1"));"};' < /tmp/squidforparse.log | mysql -D traffics -u root --password=my_sql_passwd
rm -f /tmp/squidforparse.log
rm -f /tmp/access.log.0
почему терять данные?
идея с rotate достаточно хорошая, но меня не устраивает ситуация, когда я запрашиваю страничку с отчетом и мне надо сидеть эти самые sleep "несколько секунд"
фишка моей статьи в том, что я сделал обновление статистики по запросу страниц не считая регулярного cron'a
>Только после того как отработает скрипт, мы начнем терять данные. В файле
>access.log будет тишина. IMXO надо так:
>#!/bin/bash
>squid -k rotate
>sleep "несколько секунд"
>cp /www/logs/squid/access.log.0 /tmp/squidforparse.log
>awk '{print "INSERT INTO squid (ip,bytes,link,trans,time) VALUES(\""$3"\","$5",\""$7"\",\""$9"\",from_unixtime("$1"));"};' < /tmp/squidforparse.log | mysql -D
>traffics -u root --password=my_sql_passwd
>rm -f /tmp/squidforparse.log
>rm -f /tmp/access.log.0А зачем нужно cp /www/logs/squid/access.log.0 /tmp/squidforparse.log ?
Ведь после squid -k rotate - access.log.0 - не гзипованый, станд. лог, с ним можно работать. И что мы удаляем rm -f /tmp/access.log.0? Ведь файла там нет. И зачем нужно sleep "несколько секунд"? :)
И по-моему этот вариант кривоват, если данные нужно получать по запросу, а не в кроне.
Замечательно. Я не настолько богат, что бы иметь суперкомпьютер, лопатящий базу, содержащую ВЕСЬ ЛОГ. Более 7 дней (60000000 записей. И > 2Гб) - слишком много, что бы любой отчет с помощью cgi построить, ибо занимает > 30 сек. Так что без промежуточных таблиц не обойтись. И товарищи правы - так с логом работать нельзя.
>Замечательно. Я не настолько богат, что бы иметь суперкомпьютер, лопатящий базу, содержащую ВЕСЬ ЛОГ. Более 7 дней (60000000 записей. И > 2Гб) - слишком много, что бы любой отчет с помощью cgi построить, ибо занимает > 30 сек. Так что без промежуточных таблиц не обойтись. И товарищи правы - так с логом работать нельзя.Согласен, но если у вас в организации такое потребление трафика, то наверно, неспроста, и контора не бедная, чтоб купить себе для этих целей емкую дисковую систему на сервер. Соответственно, будьте добры не плевать в практически единственный материал по данной тематике. Я выложил _ПРОСТЕЙШИЙ_ пример как можно делать, ибо остальное, если вы не дураки, вы додумаете сами. Еще добавлю, что имея такие обьемы логов, можно одну таблицу держать для подробной статистики по паре последних месяцев, а другую пополнять по истечении каждого месяца на базе информации в первой таблице, попутно освобождая первую таблицу за устаревший месяц.
да, и еще... БД на то и БД, чтоб не лопатить ВЕСЬ ЛОГ, а только запрошенную вами часть. За сим се ля ви. Не к месту высказались вы.
люди, зачем все это?
веть есть же squid2mysql (http://evc.fromru.com/squid2mysql/index.html) и custom_log patch from squid-cache.org CVS.
зачем изобретать велосипед с квадратными колесами ? :-)
>зачем изобретать велосипед с квадратными колесами ? :-)
Ну так это все вещи достаточно несложные, что-бы время потраченное на установку и изучение готового софта, было сравнимо с временем потраченным на написание своего. Тот случай когда дешевле изобрести и собрать велосипед, чем заработать на него денег и купить.
Я поставил себе squid2mysql, увидел что у него квадратные колеса :-), например он подменяет собой /etc/init.d/squid, а это как-то некрасиво, да и создать базу мне пришлось руками, его скрипт на разных этапах отваливался. Вот из-за квадратных колес прибил его, и _за_такое-же_время_ нарисовал свои скрипты, которые (я писал чуть выше, снимают tail`ом) абсолютно не трогают никаких системных компонентов (включая файлы логов).
кто нить получил утилику которую обещал выслать Карл?)
У меня нечто подобное работает у самого(мене функционально в том плане, что не показывает сколько из кеша было вытянуто, а скока нет) месяцев пять - просто использование сарга запарило, да и надо что-то а-ля риал-тайм для юзверов, но я бы не сказл, что совсем не затрагивает файлов - полностью не читал статью - она мне не столь интересна, раз моя софтина работает - но ты же тоже должен очищать /_чего_то_там_/squid/logs/access.log после того как кинул очередную порцию в топку ;))) базы
Кстати, мой совет(впрочем может ты уже сам так же реализовал) - наваять клиенты на сях/делфе, который бы коннектился к базе раз 20-30 минут и получал данные по статистике пользоваеля, что бы он знал когда пробьет его час и пора готовиться к отключению трафика ;)))
Оч полезная штука. ;)))
Самая простая и прекрасная программа для подсчета и ограничения лимита трафика у пользователя squserlim
И ничего изобретать не надо. Пишите сами
От себя добавлю, что не помешало бы заменить в insert'е в поле link символы " на \" ;)
А как на счет function `from_unixtime' not defined? Стоит FreBSD 4.10-STABLE.
>А как на счет function `from_unixtime' not defined? Стоит FreBSD 4.10-STABLE.это ж, батенька, функция mysql v4.xx
попробуйте написать ее ПРОПИСНЫМИ БУКВАМИ
Написал программку, которая складывает логи сквида в базу PostgreSQL. Буду рад, если кому поможет. http://gkm.sumy.ua/~butsyk/s2pg.tar.bz2
прорамма складывает логи сквида в базу MySQL, PostgreSQL, используя родные API этих баз, очень маленькая и шустренькая. Есть также скрипты на перле для анализа логов. Буду рад, если кому поможет.
http://abutsyk.sumy.ua/src/s2pg.tar.bz2
Проект перемещен. http://squid2db.sourceforge.net/
http://linux.alhimia.ru/projects/misc/squid-traffic/
Мой вопрос немного оффтоп для данной ветки, но тема, безусловно, смежная.
Во многих предложенных системах анализа трафика Squid используется basic аутентификация для ведения статистики по пользователям. По сути имена и пароли передаются в открытом виде. В случае, если еще вводятся лимиты для пользователей, то этот становится опасно - передавать в открыто виде.
Есть идеи создания безопасной аутентификации на прокси?
При запуске скрипта squid-to-mysql выдает следующее, как это победить, подскажите плиззз, горю.............!!!!!!!!!awk: cmd. line:1: {print "INSERT INTO squid (ip,bytes,link,trans,time) VALUES(\""$3"\","$5",\""$7"\",\""$9"\",from_unixtime("$1"));};
awk: cmd. line:1: ^ unterminated string
А сейчас так :(
proxy:/srv/www/htdocs/reports # ./squid-to-mysql
ERROR at line 1: Unknown command '\%'.
Я вообще для этой цели патч на сквид писал ... конечно не очень хороший, но считает ... кому надо могу кинуть
>Я вообще для этой цели патч на сквид писал ... конечно не
>очень хороший, но считает ... кому надо могу кинутьСкинь плиззз.......
cathul@ukr.net
Привет. Нужна помощь, при попытке доступа к странице статистики выдается:Fatal error: Call to undefined function: mysql_connect() in /var/www/html/reports/index.php on line 4
скрипт автора взят из статьи и не подвергался изменениям, единственное разница в том, что у меня пути разные к корню Апача, то есть /var/www/html, ну да это мелочь.....
проверь пароль на коннект к базе
Скорее всего у тебя не установлен phpmysql
Скрипт не очень актуален, ибо БД забивается ненужным хламом, допустим один и тот же IP дублируется, меняя разве что размер байтов. Можно ли как-нибудь суммировать эти значения? Иначе с такими темпами за неделю пару Гб будет весить.
>Иначе с такими темпами за неделю пару
>Гб будет весить.
Так и есть :), и даже не пару гиг, а много больше.
Но я считаю трафик совсем по другому, а результаты этого скрипта использую для решения "спорных" вопросов "да я вощще в интернете не был!", а в таких случаях, очень полезны полные урлы с размером файлов.
Данные больше месяца не хранятся, прибиваются. Спорные вопросы длинной в месяц бывают ОЧЕНЬ редко.Кстати, то что ты сделал в своем скрипте, ИМХО, значительно проще, быстрее, и правильней сделать в том же mysqlе. Из подробной базы, в твою, агрегированную, потом из подробной удалить.
Лично я сделал так:
--------------------------------------------------
write:
--------------------------------------------------
#! /bin/sh#
#write log
##copy squid log
cp /var/log/squid/access.log /tmp/squid.log
>/var/log/squid/access.log#count ip,bytes
cat /tmp/squid.log | awk '{print $3}'| sort -u > /tmp/ips
for i in `cat /tmp/ips` ; do
echo -n "$i "
grep -w $i /tmp/squid.log > /tmp/t1
cat /tmp/t1 | awk 'BEGIN {a=0} {a=a+$2} END{print a}'
done#clear
>/tmp/squid.log
rm -f /tmp/ips
rm -f /tmp/t1
--------------------------------------------------
run
--------------------------------------------------
#! /bin/sh#
#run log > mysql
##run write
/root/.sh/sq-my/write > /tmp/run.log
#insert time
awk '{print $1,$2,strftime("%s")}' /tmp/run.log > /tmp/squid.log
rm -f /tmp/run.log
#into mysql
awk '{print "INSERT INTO squid (ip,bytes,time) VALUES(\""$1"\","$2",from_unixtime("$3"));"};' < /tmp/squid.log | mysql -h host -D squid -u squid --password=pass >/dev/null 2>&1
rm -f /tmp/squid.log
были и такие идеи, но быстрее было накатать скриптик, чем еще с крондом возиться :)
Ссылка дохлая! Ищите тут! http://ftp.citkit.ru/pub/sourceforge/s/sq/
Была взята squid2db-1.1
Демон регулярно падал из за неэкранированных апострофов и неправильной размерности переменной blob.
Устранено...Пока стоит...Могу выслать, кому надо...
а MYSAR уже не рулит?
Я может что-то не догоняю, но как вы считаете траффик фтп,... Я в логах сквида этого не нашел
>Я может что-то не догоняю, но как вы считаете траффик фтп,... Я
>в логах сквида этого не нашелНикак :)
Точнее, не "никак", а весь трафик, я например, считаю совсем другими способами, а логи сквида занесенные в мускул очень помогают при общении с клиентами.
Ну или, если понадобился какой-то анализ http трафика - сколько туда, да сколько сюда...
А SAMS использовать совместно с контролером домена нельзя ? 8) отличный тарификатор + ACL + правила для юзеров
Почитал статью, понравилось, притом что от меня как раз попросили такую вещь, только у меня возникла одна загвоздка у меня отдельно действующий сервер Mysql, как ему передать данный из сквидовского access.log'a???
A как из url еще и имя сервера вырвать?
MySAR + + подробная статистика за месяц
http://kb.etarea.com/2008/05/21/mysar-подробная-статистика-за-месяц/