Страница 1 из 1

Парсер логов Squid

Добавлено: 2007-02-21 13:51:21
Agronom
Посоветуйте парсер логов Сквида, который бы раз в сутки закидывал в БД (Постгрис) данные из логов с суммированием данных по каждому IP за сутки

Добавлено: 2007-02-21 14:55:49
Alex Keda
awk?

Добавлено: 2007-02-21 15:17:29
Agronom
пока нашел squidlimit....сравню

Добавлено: 2007-02-27 15:14:48
Agronom
lissyara писал(а):awk?
Можно ссылочку?

Добавлено: 2007-02-27 15:30:54
Alex Keda
я, для нужд конторы, ткое рисовал:
more /usr/local/scripts/work/squid_limits.sh

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

#!/bin/sh

# Год и месяц
year=`date '+%Y'`
month=`date '+%m'`

# Где логи сквида
squid_log="/var/old_log/${year}/${month}/squid.log"
#squid_log="squid.tmp.log"
# Временный файл
tmp_file="/tmp/squid.limits.$$.tmp"
# Файл исключений
exclude_file="/usr/local/etc/sarg/exclude.hosts"
# Файл с заоченными юзерами
lock_file="/usr/local/etc/squid/main_configs/overhead.users"
# Данные для mysql
mysql_preffix="/usr/local/bin/mysql --user=squid --password=squid --database=squid"


# Грохаем предыдущую таблицу с траффикм
${mysql_preffix} --execute="TRUNCATE \`user_traffic\`"
# Грохаем предыдущий список залоченных юзеров
echo "# Файл создан автоматически `date +%Y-%m-%d` в `date +%H:%M:%S`
" > ${lock_file}

# Достаём список пользователей
cat ${squid_log} | grep -v " d-zykov " | awk '{print $8}' | grep -v "^-" | sort \
| uniq -c | sort | awk '{print $2}' |
{
while read user_name
do
        # ПРоверяем, что пользователь не пустой
        if [ `echo "${user_name}" | wc -c` -ge 2 ]
        then

        # Выгребаем логи по этому пользователю, и считаем траффик
        cat ${squid_log} | grep -v " d-zykov " | grep " ${user_name} " |\
        grep --fixed-strings --invert-match --file=${exclude_file} \
        | awk '
                BEGIN { d=0 }
                {
                        # Суммируем 5-й столбец на вводе - траффик
                        d=$5+d
                }
                END {
                        printf " %s \n",d
                } ' > ${tmp_file}
        read user_bytes < ${tmp_file}
        rm -f ${tmp_file}
#       echo "USER = ${user_name};      traffic = ${user_bytes}"

        # Загоняем имя пользователя в БД - дефолтовый лимит 314572800 = 300 мег
        ${mysql_preffix} --execute="INSERT INTO \`user_limits\` VALUES \
                ('','${user_name}','314572800')" > /dev/null 2>&1
        # Загоняем данные о траффике в БД
        ${mysql_preffix} --execute="INSERT INTO \`user_traffic\` VALUES \
                ('','${user_name}','${user_bytes}')"

        # Достаём лимит этого пользователя
        user_limit=`${mysql_preffix} --skip-column-names  --execute="SELECT \
                user_limit FROM user_limits WHERE user_name='${user_name}'"`
#       echo "Пользователь = ${user_name};      Траффик = ${user_bytes};        Лимит = ${user_limit}"
        # Сравниваем лимит с текущим траффиком
        if [ ${user_bytes} -gt ${user_limit} ]
        then
        # Добавляем юзера в списки залоченных
        echo "Ограничен пользователь ${user_name}, траффик = ${user_bytes}, лимит = ${user_limit}"
        echo ${user_name} >> ${lock_file}
        fi
        fi
done
}

/usr/local/sbin/squid -k reconfigure

Добавлено: 2007-02-27 15:32:52
Alex Keda
ну и страничка есть на php к этому делу.
чел, скока лимит, сколка израсходовал.
приближающиеся к лимиту подсвечиваются одним, превысившие - другим цветом.
ограничения - через squidGuard, с редиректорм на страничку о причине...
лепотя...

Добавлено: 2007-02-27 15:37:34
dikens3
Как вариант по суммированию с помощью awk:

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

192.168.2.4 - - [27/Feb/2007:11:09:59 +0300] "GET http://new.qip.ru/newver.php HTTP/1.0" 200 215 TCP_MISS:DIRECT
192.168.2.4 - - [27/Feb/2007:11:13:09 +0300] "GET http://sb.google.com/safebrowsing/update? HTTP/1.1" 200 192 TCP_MISS:DIRECT
192.168.2.4 - - [27/Feb/2007:11:13:12 +0300] "GET http://counting.kmindex.ru/? HTTP/1.1" 200 329 TCP_MEM_HIT:NONE
192.168.2.4 - - [27/Feb/2007:11:13:12 +0300] "GET http://counting.kmindex.ru/10.gif? HTTP/1.1" 200 329 TCP_MEM_HIT:NONE
192.168.2.4 - - [27/Feb/2007:11:13:12 +0300] "GET http://sb.google.com/safebrowsing/lookup? HTTP/1.1" 200 192 TCP_MISS:DIRECT
192.168.2.4 - - [27/Feb/2007:11:13:12 +0300] "GET http://toolbarqueries.google.ru/search? HTTP/1.1" 200 199 TCP_MISS:DIRECT
192.168.2.4 - - [27/Feb/2007:11:13:18 +0300] "GET http://counting.kmindex.ru/? HTTP/1.1" 200 329 TCP_MEM_HIT:NONE
192.168.2.4 - - [27/Feb/2007:11:13:18 +0300] "GET http://sb.google.com/safebrowsing/lookup? HTTP/1.1" 200 192 TCP_MISS:DIRECT
192.168.2.4 - - [27/Feb/2007:11:13:18 +0300] "GET http://counting.kmindex.ru/10.gif? HTTP/1.1" 200 329 TCP_MEM_HIT:NONE
192.168.2.4 - - [27/Feb/2007:11:13:19 +0300] "GET http://toolbarqueries.google.ru/search? HTTP/1.1" 200 199 TCP_MISS:DIRECT

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

#cat logfile | awk '{s+=$10} END {print s}'
2505

Добавлено: 2007-02-28 14:08:04
Agronom
есть парсер с веб-интерфейсом, который показывает траф по годам, при выборе года - по месяцам, при выборе месяца - по дням а в днях - по юзерам(метры и урлы). Логи парсятся в Постгрис, в принципе подходит LightSquid, но он неудобный по сравнению с имеющимся и всё бы ничего было, только после НГ перестал работать парсер. У него алгоритм такой - подключаемся к БД-Сбрасываем индексы-Вставляем данные в таблицу учитывающую ВСЕ запросы пользователей - Очищаем таблицу где собраны суммарные данные за день по юзерам - суммируем записи из подробной таблицы и вписываем эти данные в общую таблицу - дальше обслуживание БД (создание индексов, дефрагментация и пр.) Индексы то он сбрасывает и данные в подробную таблицу вписываются, а вот дальше никак. И логов то нет, чтобы посмотреть что не так (правда когда скрипт вручную запускаю с консоли видно как он выдает ошибки типа "use of uninitialized value in concatenation (.)"
Вот текст скрипта:

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

#!/usr/bin/perl -w


use DBI;
use Time::localtime;
use MIME::Lite;

open (f2,">>/var/log/inetsys/inetcheck.log");

$dbh = DBI->connect('DBI:Pg:dbname=billingdb;host=192.168.0.3','billing','passwdbill')
    or mail("Billing-system[Squid]","Could't not connect to the data base or data base does not exists");

$count = 0;
$count_inform = 0;
$tm_start = localtime;
$start_prog = sprintf ("d-d-d d:d:d\n",
        $tm_start->year+1900,
        $tm_start->mon+1,
        $tm_start->mday,
        $tm_start->hour,
        $tm_start->min,
        $tm_start->sec);

open (f1,"/home/squid/access.log")
    or mail("Billing-system[Squid]","Counld't open squid file or file does not exists");
    
$dbh->do("DROP INDEX control_dat") or mail("Billing-system[Squid]","Counld't drop index control_dat on sum_traf");
$dbh->do("DROP INDEX sum_traf_usr") or mail("Billing-system[Squid]","Counld't drop index sum_traf_usr on sum_traf");
$dbh->do("DROP INDEX control_begin_time") or mail("Billing-system[Squid]","Counld't drop index begin_time on control");
while (<f1>)
{
    (@args) = split(/\s+/,$_);
    ($_, $url) = split (/:\/\//,$args[6]);
    @host = split(/\/+/,$url); #БШДХПЮЕЛ ХГ спкЮ ОПНРНЙНК Х ЯНУПЮМЪЕЛ спк
    ($res_cache,$squidus) = split(/\//,$args[3]); # БШДХПЮЕЛ ЯРЮРСР ОНОЮДЮМХЪ Б ЙЕЬ
    $start = starttime($args[0]);
    if (($res_cache eq 'TCP_HIT') ||
        ($res_cache eq 'UDP_HIT') ||
        ($res_cache eq 'TCP_HIT_MEM') ||
        ($res_cache eq 'TCP_IMS_HIT') ||
        ($res_cache eq 'TCP_NEGATIVE_HIT') ||
#        ($res_cache eq 'TCP_REFRESH_HIT') ||
        ($res_cache eq 'TCP_REF_FAIL_HIT') ||
        ($res_cache eq 'UDP_HIT_OBJ') ||
        ($res_cache eq 'TCP_DENIED'))
        {  
        }
        else
        {
                if ($args[7] =~ /\\/){($dom,$usr) = split (/\\/,$args[7]);}
                else {$usr = $args[7];}
#        ($dom,$usr) = split (/\\/,$args[7]);
        $dbh->do("INSERT INTO control VALUES ('$args[2]',$args[1],$args[4],'$start','$host[0]','$usr')")
            or mail("Billing-system[Squid]","Counld't insert records to the data base in table 'inform' with tables 'idkey'");
        $count_inform++;
        }
$count++;
}
$squidus_done = 0;

sub starttime
{
    $tm = localtime ($args[0]);
    @tim =  ($tm->year+1900, $tm->mon+1, $tm->mday,$tm->hour, $tm->min, $tm->sec);
    $str = "$tim[0]-$tim[1]-$tim[2] $tim[3]:$tim[4]:$tim[5]";
    return  $str;
}

sub mail
{
    $msg = MIME::Lite->new(
                 From    =>'squid@ourcompany.ru',
                 To      =>'root@ourcompany.ru',
                 Subject =>$_[0],
                 Type    =>'TEXT',
                 Data    =>"Billing report[Squid]"
              );  
$msg->attach(Type => 'text/html',
Data => qq{
  $_[1]
           }    
        );

MIME::Lite->send('smtp', "192.168.0.1", Timeout=>60);
$msg->send();
$squidus_done = 1;
}

$tm_stop = localtime;
$stop_prog = sprintf ("d-d-d d:d:d\n",
        $tm_stop->year+1900,
        $tm_stop->mon+1,
        $tm_stop->mday,
        $tm_stop->hour,
        $tm_stop->min,
        $tm_stop->sec);

$dbh->do("TRUNCATE TABLE sum_traf");
$dbh->do("insert into sum_traf select ipaddr,sum(query_time) as sum_time,sum(byte) as sum_byte,begin_time as dat, usr from control where begin_time >= '2007-01-01' group by ipaddr,dat,usr");

$tm_stop = localtime;
$create_table = sprintf ("d-d-d d:d:d\n",
        $tm_stop->year+1900,
        $tm_stop->mon+1,
        $tm_stop->mday,
        $tm_stop->hour,
        $tm_stop->min,
        $tm_stop->sec);


$dbh->do("CREATE INDEX control_dat ON sum_traf USING btree (dat)") or mail("Billing-system[Squid]","Counld't create control_dat index on sum_traf");
$dbh->do("CREATE INDEX sum_traf_usr ON sum_traf USING btree (dat)") or mail("Billing-system[Squid]","Counld't create sum_traf_usr index on sum_traf");
$dbh->do("CREATE INDEX control_begin_time ON control USING btree (begin_time date_ops)") or mail("Billing-system[Squid]","Counld't control_begin_time create index on control");
$tm_stop = localtime;
$create_index = sprintf ("d-d-d d:d:d\n",
                $tm_stop->year+1900,
                $tm_stop->mon+1,
                $tm_stop->mday,
                $tm_stop->hour,
                $tm_stop->min,
                $tm_stop->sec);

$dbh->do("VACUUM sum_traf");
$dbh->do("VACUUM control");
$tm_stop = localtime;
$create_vacuum = sprintf ("d-d-d d:d:d\n",
                $tm_stop->year+1900,
                $tm_stop->mon+1,
                $tm_stop->mday,
                $tm_stop->hour,
                $tm_stop->min,
                $tm_stop->sec);
$dbh->do("CLUSTER control_begin_time ON control");
$tm_stop = localtime;
$create_cluster = sprintf ("d-d-d d:d:d\n",
                $tm_stop->year+1900,
                $tm_stop->mon+1,
                $tm_stop->mday,
                $tm_stop->hour,
                $tm_stop->min,
                $tm_stop->sec);

$dbh->do("VACUUM ANALYZE sum_traf");
$dbh->do("VACUUM ANALYZE control");
$tm_stop = localtime;
$create_vacuum_analyze = sprintf ("d-d-d d:d:d\n",
                $tm_stop->year+1900,
                $tm_stop->mon+1,
                $tm_stop->mday,
                $tm_stop->hour,
                $tm_stop->min,
                $tm_stop->sec);


    if (!$squidus_done)
    {
    mail("Billing-system[Squid]",
    "Billing report start at $start_prog and stop at $stop_prog.<br>
    Count all records are - $count.<br>
    Count all inserted records in 'control' are - $count_inform.<br>
    Create temp table at $create_table.<br>
    Create index at $create_index. <br>
    Create vacuum at $create_vacuum. <br>
    Create cluster at $create_cluster. <br>
    Create vacuum analyze at $create_vacuum_analyze. <br>
    All right! Enjoy of new billing!");
    unlink("/home/squid/access.log");
    }
Может кто подскажет - в чем причина неработоспособности?