Пытаюсь собирать логи в удаленную БД MySQL, использую частично технологию предложенную в squid2mysql, перенаправляю лог через syslogd.
/usr/local/etc/squid/squid.conf:
Код: Выделить всё
access_log syslog:local4.info squid
Код: Выделить всё
local4.info |exec /usr/local/squid/sbin/squid2mysq
local4.info /var/log/squid/access.log
Код: Выделить всё
#!/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";
}
Я так понимаю syslogd создает виртуальный pipe и он после отрабатывания cacti падает.
Пробовал и оригинальный squid2mysql, создавал вручную named pipe, в конфиге сквида направлял лог в него, и в скрипте запуска сквида указывал
Код: Выделить всё
/usr/local/squid/sbin/squid2mysql < /var/log/squid/access.log &
Как побороть данную проблему?