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
В веб браузере смотрим результат.

