В предыдущих заметках мы установили и настроили Sarg, в качестве генератора отчётов, и Nginx, в качестве средства отображения таковых. Теперь сделаем последний шаг, автоматизировав отчётность по следующему принципу, например:
Срез с начала суток по время обеденного перерыва;
Срез с начала суток по завершение суток с перезаписью предыдущего среза, включающего в себя половину суток;
Срез за прошедший месяц с перезаписью предыдущих отчётов за прошедший месяц.
Срез с начала суток по завершение суток с перезаписью предыдущего среза, включающего в себя половину суток;
Срез за прошедший месяц с перезаписью предыдущих отчётов за прошедший месяц.
Создаём файл рабочего скрипта:
# touch /etc/sarg/make_report.sh
# chmod ugo+x /etc/sarg/make_report.sh
# chmod ugo+x /etc/sarg/make_report.sh
#!/bin/bash
# make_report.sh {now|day|month}
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export LANG="en_US.UTF-8"
# Принимаем в переменные с "говорящими" именами входящие аргументы
INSTANCE=${0}
OPERATION=${1}
CONF="-f /etc/sarg/sarg.conf"
PLACE_LOG=/var/log/squid3
PLACE_WEB=/var/www/stat.proxy.local
PREFIX_LOG_ORDINARY="access-ordinary.log"
PREFIX_LOG_TRANSPARENT="access-transparent.log"
EXCLUDE_LOG=".gz"
DATE=`date +"%Y-%m-%d %H:%M:%S"`
INPUT_LOGS=""
DATE_FROM=""
DATE_TO=""
DATE_RANGE=""
# Проверяем входящие аргументы на наличие и корректность
if [ ! ${OPERATION} ] || [ ! `echo "|now|day|month|" | grep -i "|${OPERATION}|"` ]
then
echo "Set operation in format: ${0} {now|day|month}"; echo "Canceled..."
exit 1
fi
# Переходим в директорию журналов
cd ${PLACE_LOG}
# Перебираем в цикле все объекты
OBJECT=""
for OBJECT in *
do
# Проверяем условия имени файла и наличие файла
if [ "`echo ${OBJECT} | grep -i ${PREFIX_LOG_ORDINARY}`" != "" ] || [ "`echo ${OBJECT} | grep -i ${PREFIX_LOG_TRANSPARENT}`" != "" ] && [ "`echo ${OBJECT} | grep -i ${EXCLUDE_LOG}`" == "" ] && [ -f "./${OBJECT}" ]
then
# Формируем список всех обрабатываемых журналов
INPUT_LOGS="${INPUT_LOGS} -l ${PLACE_LOG}/${OBJECT}"
fi
done
# Задаём параметры генерирования журнала текущего дня
if [ "${OPERATION}" == "now" ]
then
DATE_FROM=`date +"%d/%m/%Y"`
DATE_TO=`date +"%d/%m/%Y"`
fi
# Задаём параметры генерирования журнала прошедшего дня
if [ "${OPERATION}" == "day" ]
then
DATE_FROM=`date --date "1 day ago" +"%d/%m/%Y"`
DATE_TO=`date --date "1 day ago" +"%d/%m/%Y"`
fi
# Задаём параметры генерирования журнала прошедшего месяца с удалением ежедневных журналов прошедшего месяца
if [ "${OPERATION}" == "month" ]
then
DATE_FROM=`date --date "1 month ago" +"01/%m/%Y"`
PART=`date +%Y-%m`;
DATE_TO=`date --date "${PART}-01 1 day ago" +"%d/%m/%Y"`
# Переходим в директорию отображения журналов SARG
cd ${PLACE_WEB}
# Перебираем в цикле все объекты
OBJECT=""
FILTER=`date --date "1 month ago" +"%b%Y"`
for OBJECT in *
do
# Удаляем все журналы прошедшего месяца
TEST=`echo ${OBJECT} | grep "^[0-9][0-9]${FILTER}-[0-9][0-9]${FILTER}$"`
if [ "${TEST}" != "" ]
then
rm --force --recursive "./${OBJECT}"
fi
done
fi
# Задаём диапазон для генерируемого отчёта
# -d Date from-until dd/mm/yyyy-dd/mm/yyyy
DATE_RANGE="-d ${DATE_FROM}-${DATE_TO}"
if [ "${CONF}" != "" ] && [ "${DATE_RANGE}" != "" ] && [ "${INPUT_LOGS}" != "" ]
then
# Запускаем генерирование отчёта в низком приоритете, чтобы не мешать другим приложениям
echo -e "\n${DATE}\n" >> /var/log/sarg/sarg.log
nice -n 15 sarg -x ${CONF} ${DATE_RANGE} ${INPUT_LOGS} 1> /dev/null 2>> /var/log/sarg/sarg.log
fi
exit 0
# make_report.sh {now|day|month}
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export LANG="en_US.UTF-8"
# Принимаем в переменные с "говорящими" именами входящие аргументы
INSTANCE=${0}
OPERATION=${1}
CONF="-f /etc/sarg/sarg.conf"
PLACE_LOG=/var/log/squid3
PLACE_WEB=/var/www/stat.proxy.local
PREFIX_LOG_ORDINARY="access-ordinary.log"
PREFIX_LOG_TRANSPARENT="access-transparent.log"
EXCLUDE_LOG=".gz"
DATE=`date +"%Y-%m-%d %H:%M:%S"`
INPUT_LOGS=""
DATE_FROM=""
DATE_TO=""
DATE_RANGE=""
# Проверяем входящие аргументы на наличие и корректность
if [ ! ${OPERATION} ] || [ ! `echo "|now|day|month|" | grep -i "|${OPERATION}|"` ]
then
echo "Set operation in format: ${0} {now|day|month}"; echo "Canceled..."
exit 1
fi
# Переходим в директорию журналов
cd ${PLACE_LOG}
# Перебираем в цикле все объекты
OBJECT=""
for OBJECT in *
do
# Проверяем условия имени файла и наличие файла
if [ "`echo ${OBJECT} | grep -i ${PREFIX_LOG_ORDINARY}`" != "" ] || [ "`echo ${OBJECT} | grep -i ${PREFIX_LOG_TRANSPARENT}`" != "" ] && [ "`echo ${OBJECT} | grep -i ${EXCLUDE_LOG}`" == "" ] && [ -f "./${OBJECT}" ]
then
# Формируем список всех обрабатываемых журналов
INPUT_LOGS="${INPUT_LOGS} -l ${PLACE_LOG}/${OBJECT}"
fi
done
# Задаём параметры генерирования журнала текущего дня
if [ "${OPERATION}" == "now" ]
then
DATE_FROM=`date +"%d/%m/%Y"`
DATE_TO=`date +"%d/%m/%Y"`
fi
# Задаём параметры генерирования журнала прошедшего дня
if [ "${OPERATION}" == "day" ]
then
DATE_FROM=`date --date "1 day ago" +"%d/%m/%Y"`
DATE_TO=`date --date "1 day ago" +"%d/%m/%Y"`
fi
# Задаём параметры генерирования журнала прошедшего месяца с удалением ежедневных журналов прошедшего месяца
if [ "${OPERATION}" == "month" ]
then
DATE_FROM=`date --date "1 month ago" +"01/%m/%Y"`
PART=`date +%Y-%m`;
DATE_TO=`date --date "${PART}-01 1 day ago" +"%d/%m/%Y"`
# Переходим в директорию отображения журналов SARG
cd ${PLACE_WEB}
# Перебираем в цикле все объекты
OBJECT=""
FILTER=`date --date "1 month ago" +"%b%Y"`
for OBJECT in *
do
# Удаляем все журналы прошедшего месяца
TEST=`echo ${OBJECT} | grep "^[0-9][0-9]${FILTER}-[0-9][0-9]${FILTER}$"`
if [ "${TEST}" != "" ]
then
rm --force --recursive "./${OBJECT}"
fi
done
fi
# Задаём диапазон для генерируемого отчёта
# -d Date from-until dd/mm/yyyy-dd/mm/yyyy
DATE_RANGE="-d ${DATE_FROM}-${DATE_TO}"
if [ "${CONF}" != "" ] && [ "${DATE_RANGE}" != "" ] && [ "${INPUT_LOGS}" != "" ]
then
# Запускаем генерирование отчёта в низком приоритете, чтобы не мешать другим приложениям
echo -e "\n${DATE}\n" >> /var/log/sarg/sarg.log
nice -n 15 sarg -x ${CONF} ${DATE_RANGE} ${INPUT_LOGS} 1> /dev/null 2>> /var/log/sarg/sarg.log
fi
exit 0
В таблице "crontab" планируем запуск генератора отчётов:
# cat /etc/crontab
....
# SARG: afternoon (ежедневный статистический срез первой половины дня)
30 13 * * * root /etc/sarg/make_report.sh now &
# SARG: day (статистический срез прошедших суток)
0 1 * * * root /etc/sarg/make_report.sh day &
# SARG: month (статистический срез прошедшего месяца)
0 3 1 * * root /etc/sarg/make_report.sh month &
....
# SARG: afternoon (ежедневный статистический срез первой половины дня)
30 13 * * * root /etc/sarg/make_report.sh now &
# SARG: day (статистический срез прошедших суток)
0 1 * * * root /etc/sarg/make_report.sh day &
# SARG: month (статистический срез прошедшего месяца)
0 3 1 * * root /etc/sarg/make_report.sh month &
....