Calamaris
Calamaris (http://calamaris.cord.de) - Анализатор журналов
- Переводится с английского также как и Squid – кальмар, головоногий моллюск.
- Понимает журналы Squid, NetCache, Inktomi Traffic Server, Oops! proxy server, Compaq Tasksmart, Novell Internet Caching System, Netscape/iPlanet/SunONE Web Proxy Server, Cisco Content Engines
- Если Calamaris будет не единственным обработчиком журналов Squid, то я бы не ставил поддержку графики (от них практической пользы нет) и не выводил статистику по пользователям (другие программы это делают и полнее, и красивее). В таком облегчённом варианте он ставится быстро, и генерируемые им отчёты в будущем будет занимать меньше места.
Установка и настройка из исходников
Если не нужны графики, то достаточно одного скрипта. Распаковываем:
#tar -xzvf /path/to/calamaris-2.59.tgz
Если же хочется увидеть ещё и в графиках, то нужно устанавливать бета-версию 2.99.4.0 (сбоев не замечено) и доустановить библиотеки и модули. Для облегчения труда установим CPAN:
#apt-get install perl-CPAN
И с его помощью установим библиотеки:
#cpan install GD::Graph #cpan install NetAddr::IP
- Можно обойтись без установки CPAN и установить модули вручную, для этого берём модули GD::Graph GD::Text с сайта http://search.cpan.org/~mverb/:
- Если нужна статистика по ip адресам, то берём модуль NetAddr::IP с http://search.cpan.org/~luismunoz/NetAddr-IP-3.21/:
- Распаковываем:
#tar -xzvf GDGraph-1.43.tar.gz #tar -xzvf GDTextUtil-0.86.tar.gz #tar -xzvf NetAddr-IP-3.21.tar.gz
и устанавливаем, используя последовательность команд:
#perl Makefile.PL #make #make test #make install
Создаём каталоги для самого Calamaris и для создаваемых им отчётов:
#mkdir -p /etc/calamaris /var/www/html/reports/calamaris
Копируем calamaris.conf в /etc/calamaris/ и редактируем:
$requester_report = -1; $status_report = 1; $type_report = -1; $hostname = 'lookup'; $output_format = 'html,graph'; $output_path = '/var/www/html/reports/calamaris'; $output_file = 'index.html'; $show_reports = '0,2,5,6,8,10,11,13,14';
Копируем calamaris в /etc/calamaris/calamaris.pl. Расширение добавляем для определённости, что это скрипт на Perl.
Создаём каталог /usr/lib/perl5/calamaris (или там, где у вас находятся библиотеки perl) и копируем туда calAxestype.pm, calAxestype3d.pm, calBars3d.pm.
Копируем мануал calamaris.1 в /usr/local/man/man1/
Будем использовать скрипт, который позволит нам создавать ежедневные, еженедельные, ежемесячные и ежегодные отчёты. Ежедневные будут храниться месяц, а еженедельные и ежемесячные - год. Скрипт поместим в /etc/calamaris/calam_rep.sh. Смотрим и если нужно меняем переменные, описанные вначале. Если архивные файлы называются не access.log.0, а, например, access.log.1.bz2, то это меняем тоже. Делаем этот скрипт исполняемым:
#chmod +x /etc/calamaris/calam_rep.sh
Cоздаём отчёт:
#./calam_rep.sh yesterday /etc/calamaris/calamaris.pl: Couldn't load package calamaris::calBars3d, maybe it is not installed: No such file or directory
при такой ошибке проверяем работоспособность модуля:
#perl -e "use calamaris::calBars3d" GD object version 2.18 does not match $GD::VERSION 2.19 at /usr/lib/perl5/i386-linux/DynaLoader.pm line 253. Compilation failed in require at /usr/lib/perl5/vendor_perl/GD/Graph.pm line 36. BEGIN failed--compilation aborted at /usr/lib/perl5/vendor_perl/GD/Graph.pm line 36. Compilation failed in require at /usr/lib/perl5/calamaris/calAxestype3d.pm line 44. BEGIN failed--compilation aborted at /usr/lib/perl5/calamaris/calAxestype3d.pm line 44. Compilation failed in require at /usr/lib/perl5/calamaris/calBars3d.pm line 43. BEGIN failed--compilation aborted at /usr/lib/perl5/calamaris/calBars3d.pm line 43. Compilation failed in require at -e line 1. BEGIN failed--compilation aborted at -e line 1.
Видим, что он ожидает более старую версию модуля GD. Меняем в /user/lib/perl5/GD.pm значение на то, что он хочет:
$VERSION = "2.18"
Если выдаёт:
Can't locate GD/Graph.pm in @INC (@INC contains: /usr/local /usr/lib/perl5/5.8.0/ :
То создаём каталог GD там, где ищет perl, напр. /usr/lib/perl5/5.8.0/GD и кладём туда файл Graph.pm и каталог Graph из дистрибутива модуля GDGraph.
- Теперь ещё раз запускаем отчёт и смотрим в браузере по адресу http://our.domain.ru/reports/calamaris/days/
#./calam_rep.sh yesterday
- Создаём журнальный файл /var/log/calam_rep.log, куда будем записывать результаты запуска скрипта по cron:
#touch /var/log/calam_rep.log
- Для сборки библиотеки GD из исходников, берём её c http://www.boutell.com/gd/
- Если не установлена поддержка jpeg и png с заголовками, то доустанавливаем и проверяем куда установелно:
#rpm -i zlib-devel-1.1.4-8.i386.rpm #rpm -i libpng-devel-1.2.2-16.i386.rpm #rpm -i libjpeg-devel-6b-26.i386.rpm #rpm -ql libpng-devel ... /usr/include/pngconf.h /usr/lib/libpng.a ...
- Устанавливаем библиотеку
#tar -zxvf GD-2.19.tar.gz #./configure '--with-png=/usr/lib' '--with-jpeg=/usr/lib' '--with-zlib-dir=/usr/lib' ... Support for PNG library: yes Support for JPEG library: yes Support for Freetype 2.x library: no Support for Fontconfig library: no Support for Xpm library: no Support for pthreads: yes ... #make #make check #make install
- Аналогично устанавливаем библиотеки GDGraph, GDTextUtil, NetAddr-IP. Далее устанавливаем также как для Alt Linux.
Слабое место Calamaris – это статистика по пользователям и сайтам, а сильная сторона – это общая статистика по нагрузке на прокси-сервер. Все отчёты последовательно отображаются на одной html-страничке. Некоторые отчёты не отображаются, если в журнале не найдены необходимые для него записи. Мне удалось получить 11 отчётов. Вот их описание:
Summary | суммарная информация по работе прокси сервера (рис.1) |
Incoming requests by method | Входящие запросы по методу (Get, Post …) |
Incoming UDP(TCP)-requests by status | Входящие запросы по статусу (HIT, MISS, DENIED …) |
Outgoing requests by status | Исходящие запросы по статусу |
Outgoing requests by destination | Исходящие запросы по месту назначения |
Request-destinations by 2nd-level-domain | Сгруппированная статистика для доменов 2-го уровня, т.е. запросы на site1.example.com и site2.example.com суммируются в статистике для домена example.com |
Request-destinations by toplevel-domain | Сгруппированная статистика для доменов 1-го уровня, т.е. ru, com, org … |
TCP-Request-protocol | Распределение трафика по протоколам (рис.2) |
Requested content-type | Распределение трафика по значению поля Content-type и по статусу входящих TCP запросов (TCP_HIT, TCP_MISS, TCP_DENIED, и т.д.) |
Requested extensions | Распределение трафика по расширениям запрошенных файлов, т.е. gif, htm… |
Incoming UDP(TCP)-requests by host | Статистика по пользователям (количество запросов, скаченный объём) |
рис.1. Calamaris. Cуммарная информация по работе прокси сервера
рис.2. Calamaris. Распределение трафика по протоколам
- Осталось автоматизировать генерацию отчётов путём добавления в /etc/crontab соответствующих заданий:
#Генерируем отчёты прокси сервера Squid 30 0 * * * root /etc/calamaris/calam_rep.sh yesterday >> /var/log/calam_rep.log 35 0 * * 1 root /etc/calamaris/calam_rep.sh week >> /var/log/calam_rep.log 45 0 1 * * root /etc/calamaris/calam_rep.sh month > /var/log/calam_rep.log
Статистика для отдельного пользователя
Calamaris собирает общую статистику, но можно настроить сбор и по одному пользователю. Для этого нужно создать отдельный конфигурационный файл со слегка изменёнными настройками. Копируем файл конфигурации calamaris:
# cp /etc/calamaris/calamaris.conf /etc/calamaris/calamaris_ip.conf
Меняем в нём настройки, чтобы получилось следующее:
$domain_report = -1; $domain_report_n_level = -1; $performance_report = 60; $requester_report = -1; $requester_report_with_targets = -1; $status_report = 1; $type_report = -1; $type_report_ignore_case= 1; $hostname= 'lookup'; $output_format = 'html,graph'; $output_file= 'index.html'; $show_reports = '0,2,7,8,9,10,11,12,13,14';
Создаём скрипт /etc/calamaris/calam_rep_ip.sh, определяя в нём переменные
#!/bin/bash # Script for calamaris 3 to generate squid reports for ip # # The most recent version of this script you can find at # http://sysadminwiki.ru/wiki/Calamaris # "Usage: calam_rep_ip.sh [today|yesterday|week|month|year] [ip_address]" # # Pavel Malakhov 16.05.05 # 01.06.05 fixed problem with non-English letters in logs ($LANG added) # 22.06.05 added different dir (including cache) for each ip # 17.08.06 fixed week report: 7-th day added for a week. # fixed month report: day.1 -> day.01 in the code for a month # added year report # (changes applied acording to calam_rep.sh and did not checked yet!) # ip to monitor, can be overrided by command line parameter # IP='10.0.10.0/24:10.0.0.5:10.0.0.7'; # monitor whole subnet and 2 ip addresses IP='10.0.0.199'; if [ "$2" != "" ]; then IP=$2; fi CALAM_DIR='/etc/calamaris'; # where calamaris is SQUID_LOG_DIR='/var/log/squid'; # where squid logs are # where to store reports. Root dir, all the other will be created by this script REP_PATH_PREFIX='/var/www/html/admin/reports/calamaris/ip'; CACHE_DIR="/etc/calamaris/cache_ip/$IP"; # where to store cache files for every week YESTD=`date -d yesterday +%d`; # yesterday's day of month YESTW=`date -d yesterday +%V`; # yesterday's week of year YESTM=`date -d yesterday +%m`; # yesterday's month number YESTM2=`date -d yesterday +%m_%B`; # yesterday's month number and name YESTY=`date -d yesterday +%Y`; # yesterday's year # There is a problem with processing non-English letters, if $LANG=en_US.UTF-8 # So we have to redefine the variable. If it sets to something else or you don't # expirience the problem, comment these 2 lines. LANG=en_US export $LANG # ------------ You don't need to edit anything below --------------------------- # ------------------ [but welcome to analyze!] --------------------------------- # Check for dir for report. Create, if does not exist. function checkdir { if [ ! -e "$REPPATH" ];then echo -n `date +%c` "Dir \"$REPPATH\" is not created. Creating... "; mkdir -p $REPPATH; echo "Done."; fi; } # Check for parameters if [ "$1" = "" ]; then echo "Usage: calam_rep_ip.sh [today|yesterday|week|month|year] [ip_address]"; exit 1; fi # check for cache dir if [ ! -e "$CACHE_DIR" ];then echo -n `date +%c` "Cache dir \"$CACHE_DIR\" is not created. Creating... "; mkdir -p $CACHE_DIR; echo "Done."; fi; case "$1" in "today" ) REPPATH=$REP_PATH_PREFIX'/today'; checkdir; cd $CALAM_DIR; echo -n `date +%c` "Processing data for today... "; cat $SQUID_LOG_DIR/access.log | ./calamaris.pl --config-file ./calamaris_ip.conf --ipfilter-include $IP --output-path $REPPATH; ;; "yesterday" ) REPPATH=$REP_PATH_PREFIX'/days/'$YESTD; checkdir; cd $CALAM_DIR; echo -n `date +%c` "Processing data for yesterday... "; cat $SQUID_LOG_DIR/access.log.0 | ./calamaris.pl --config-file ./calamaris_ip.conf --ipfilter-include $IP \ --output-path $REPPATH --cache-output-file $CACHE_DIR/day.$YESTD; ;; "week" ) REPPATH=$REP_PATH_PREFIX'/weeks/'$YESTW'/'$IP; checkdir; cd $SQUID_LOG_DIR; echo -n `date +%c` "Processing data for week... "; cat access.log.7 access.log.6 access.log.5 access.log.4 access.log.3 access.log.2 access.log.1 access.log.0 \ | $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --ipfilter-include $IP \ --output-path $REPPATH --cache-output-file $CACHE_DIR/week.$YESTW; ;; "month" ) REPPATH=$REP_PATH_PREFIX'/months/'$YESTM2'/'$IP; checkdir; cd $CACHE_DIR; CACHEFILES=""; for ((i=1; i<=31; i++)); do if [ "$i" -lt "10" ]; then FILE='day.0'$i else FILE='day.'$i fi if [ -e "$FILE" ]; then if ["$CACHEFILES" = ""]; then CACHEFILES=$FILE; else CACHEFILES=$CACHEFILES':'$FILE; fi fi done echo 'files to process '$CACHEFILES; echo -n `date +%c` "Processing data for month... "; $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --ipfilter-include $IP --cache-input-file \ $CACHEFILES --no-input --output-path $REPPATH --cache-output-file $CACHE_DIR/month.$YESTM; echo "Done"; # clean up cache directory at the start of a month # delete only cached days, leave cached weeks DD=`date +%d`; if [ "$DD" = "01" ]; then echo -n `date +%c` "Cleaning up cache dir... "; rm -f $CACHE_DIR/day.*; fi ;; "year" ) REPPATH=$REP_PATH_PREFIX'/years/'$YESTY; checkdir; cd $CACHE_DIR; CACHEFILES=""; for ((i=1; i<=12; i++)); do if [ "$i" -lt "10" ]; then CFILE='month.0'$i; else CFILE='month.'$i; fi if [ -e "$CFILE" ]; then if [[ $CACHEFILES = "" ]]; then CACHEFILES=$CFILE; else CACHEFILES=$CACHEFILES':'$CFILE; fi fi done echo 'files to process '$CACHEFILES; echo -n `date +%c` "Processing data for month... "; $CALAM_DIR/calamaris.pl --config-file $CALAM_DIR/calamaris_ip.conf --cache-input-file $CACHEFILES \ --no-input --output-path $REPPATH --cache-output-file $CACHE_DIR/year.$YESTY; echo "Done"; # clean up cache directory at the start of a year DD=`date +%d`; MM=`date +%m`; if [ "$MM" = "01" ]; then if [ "$DD" = "01" ]; then echo -n `date +%c` "Cleaning up cache dir... "; rm -f $CACHE_DIR/week.*; rm -f $CACHE_DIR/month.*; fi fi ;; esac echo "Done"; echo `date +%c` "---Everything is done" exit 0
Запускаем его, например, так:
# /etc/calamaris/calam_rep_ip.sh week 10.0.0.5
В веб браузере смотрим результат.