UMGUM.COM (лучше) 

Автоматизация SARG ( Автоматизация генерирования отчётов SARG. )

1 декабря 2011  (обновлено 15 августа 2016)

OS: Debian GNU/Linux Squeeze.

В предыдущих заметках мы установили и настроили Sarg, в качестве генератора отчётов, и Nginx, в качестве средства отображения таковых. Теперь сделаем последний шаг, автоматизировав отчётность по следующему принципу, например:

Срез с начала суток по время обеденного перерыва;
Срез с начала суток по завершение суток с перезаписью предыдущего среза, включающего в себя половину суток;
Срез за прошедший месяц с перезаписью предыдущих отчётов за прошедший месяц.


Создаём файл рабочего скрипта:

# touch /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

В таблице "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 &
....


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )