Обработка логов SQUID

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
lightix
проходил мимо
Сообщения: 5
Зарегистрирован: 2009-04-15 7:21:39

Обработка логов SQUID

Непрочитанное сообщение lightix » 2009-04-15 7:54:04

Имеется сервер под управлением FreeBSD 6.3, использующийся в качестве прокси-сервера (SQUID 2.6 STABLE16).
Пытаюсь собирать логи в удаленную БД MySQL, использую частично технологию предложенную в squid2mysql, перенаправляю лог через syslogd.
/usr/local/etc/squid/squid.conf:

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

access_log    syslog:local4.info squid
/etc/syslog.conf:

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

local4.info   |exec /usr/local/squid/sbin/squid2mysq
local4.info   /var/log/squid/access.log
/usr/local/squid/sbin/squid2mysq:

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

#!/usr/bin/perl
# 
$mysqluser="test";			# MySQL user name
$mysqlpass="test";			# MySQL user password
$mysqlserv="192.168.2.144";		# MySQL server
$mysqlport="3306";			# MySQL server port
$mysqldbas="test";			# MySQL database name

use DBI;
use DBI::DBD;

$dbh=DBI->connect("DBI:mysql:database=$mysqldbas;host=$mysqlserv;port=$mysqlport",$mysqluser,$mysqlpass,{AutoCommit=>1,RaiseError=>0,PrintError=>1})||&errorcon;

$sth=$dbh->prepare("INSERT INTO access_log(ip,url,host,hdate,byte)\
 VALUES(?,?,?,?,?)");

while(<>) {
    chomp;				# here we now get a string!
#					splitting string onto subdata
    @lines=split(' ');

#					timestamp
    $lines[5]=~tr/./ /;
    @_timestamp=split(' ',$lines[5]);
    $cts=$_timestamp[0];

#   date=
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($cts);
    $year=$year+1900;
    $mon=$mon+1;
    $hour=$hour+3;
    if ($hour>24) {
	$hour=$hour-24;
	$mday=$mday+1;
    }
    $hdate="$year-$mon-$mday $hour:$min:$sec";
#   ip=
    $ip=$lines[7];
    
    @codestatus=split('/',$lines[8]);
    if ($codestatus[0] eq "TCP_HIT") { $_code=0; }
    if ($codestatus[0] eq "TCP_MISS") { $_code=1; }
    if ($codestatus[0] eq "TCP_REFRESH_HIT") { $_code=2; }
    if ($codestatus[0] eq "TCP_REF_FAIL_HIT") { $_code=3; }
    if ($codestatus[0] eq "TCP_REFRESH_MISS") { $_code=4; }
    if ($codestatus[0] eq "TCP_CLIENT_REFRESH_MISS") { $_code=5; }
    if ($codestatus[0] eq "TCP_IMS_HIT") { $_code=6; }
    if ($codestatus[0] eq "TCP_SWAPFILE_MISS") { $_code=7; }
    if ($codestatus[0] eq "TCP_NEGATIVE_HIT") { $_code=8; }
    if ($codestatus[0] eq "TCP_MEM_HIT") { $_code=9; }
    if ($codestatus[0] eq "TCP_DENIED") { $_code=10; }
    if ($codestatus[0] eq "TCP_OFFLINE_HIT") { $_code=11; }
    if ($codestatus[0] eq "UDP_HIT") { $_code=12; }
    if ($codestatus[0] eq "UDP_MISS") { $_code=13; }
    if ($codestatus[0] eq "UDP_DENIED") { $_code=14; }
    if ($codestatus[0] eq "UDP_INVALID") { $_code=15; }
    if ($codestatus[0] eq "UDP_MISS_NOFETCH") { $_code=16; }
    if ($codestatus[0] eq "NONE") { $_code=17; }

#   status
    $_status = $codestatus[1];
#   byte    
    $byte=$lines[9];
#       
    $url=$lines[11];
    
    @host = split('/',$url);
    
if (($_code eq "1")&&($_status ne "404")&&($_status ne "400")) 
    {
     $sth->execute($ip,$url,$host[2],$hdate,$byte) || die "cannot transfer data";
    }


}

$dbh->disconnect;

exit 1;

sub errorconn {
    die "cannot log to MySQL";
}
Помимо этого, каждую минуту cacti собирает статистику, в том числе и со сквида. И после этого в базу уже ничего не пишется, при этом в процессах сам скрипт висит. После syslogd reload опять пишет, но через минуту отваливается.
Я так понимаю syslogd создает виртуальный pipe и он после отрабатывания cacti падает.
Пробовал и оригинальный squid2mysql, создавал вручную named pipe, в конфиге сквида направлял лог в него, и в скрипте запуска сквида указывал

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

/usr/local/squid/sbin/squid2mysql < /var/log/squid/access.log &
Ситуация та же - через минуту после запуска запись в базу прекращается, хотя скрипт висит в процессах (ждет поступления данных).

Как побороть данную проблему?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

lightix
проходил мимо
Сообщения: 5
Зарегистрирован: 2009-04-15 7:21:39

Re: Обработка логов SQUID

Непрочитанное сообщение lightix » 2009-04-15 12:21:43

Вопрос снимается: нашел проблему. Дело было совсем не в SNMP, а в том, что в скрипте я конектился к базе до цикла while(<>), и через минуту меня mysql выбрасывал по таймауту ;)