Главная
Главная Руководства FreeBSD › Ротация логов в nginx



Автор:

Статья опубликована: 2015-04-16 12:15:38
Последние правки: 2017-01-11 14:07:54

Настраиваем ротацию логов в nginx.

В nginx нет такой удобной программы как rotatelogs в Apache поэтому придется все делать своими силами. Пишем простенький скрипт и запускаем его в 00:00 раз в сутки. Скрипт будет копировать все логи в папку с датой, архивировать все логи в папках старше 2-х дней и удалять папки с логами старше 40 дней.
#!/bin/sh
DIR=/var/log/nginx
PID=/var/run/nginx.pid
DATE1=`/bin/date -v-1d "+%Y%m%d"`
DATE2=`/bin/date -v-3d "+%Y%m%d"`
DATE3=`/bin/date -v-41d "+%Y%m%d"`

cd ${DIR}
/bin/mkdir ${DIR}/${DATE1}
mv -n ${DIR}/*.log ${DIR}/${DATE1}
/bin/kill -USR1 `/bin/cat ${PID}`

# remove oldest directories
if [ -d ${DIR}/${DATE3} ] ; then
   /bin/sleep 60
   /bin/rm ${DIR}/${DATE3}
fi

# archive files
if [ -d ${DIR}/${DATE2} ] ; then
   /bin/sleep 1800
   /usr/bin/nice -20 /usr/bin/xz ${DIR}/${DATE2}/*.log
fi
С удивлением обнаружил, что в утилите date в Debian в параметрах нельзя задать дельту в днях, поэтому вот вам для Debian немного более сложный скрипт на perl, который может работать с неограниченным числом директорий, где есть логи. В массив @list необходимо добавить директории сайтов, где находится директория logs. Например, /home/site1/logs, в @list добавляем /home/site1. Скрипт будет обрабатывать все заданные в @list директории.
#!/usr/bin/perl -w
use strict;
use Date::Calc;

my @list = ('');

my(@time) = localtime(time);
$time[4] += 1;
$time[5] += 1900;
$time[3] = '0'.$time[3] if $time[3] < 10;
$time[4] = '0'.$time[4] if $time[4] < 10;

my($y,$m,$d) = Date::Calc::Add_Delta_Days($time[5],$time[4],$time[3],-1);
$m = '0'.$m if $m < 10;
$d = '0'.$d if $d < 10;
my $DATE1 = $y.$m.$d;
#print $DATE1,"\n";

($y,$m,$d) = Date::Calc::Add_Delta_Days($time[5],$time[4],$time[3],-3);
$m = '0'.$m if $m < 10;
$d = '0'.$d if $d < 10;
my $DATE2 = $y.$m.$d;
#print $DATE2,"\n";

($y,$m,$d) = Date::Calc::Add_Delta_Days($time[5],$time[4],$time[3],-41);
$m = '0'.$m if $m < 10;
$d = '0'.$d if $d < 10;
my $DATE3 = $y.$m.$d;
#print $DATE3,"\n";



foreach my $dir(@list){
    mkdir "$dir/logs/$DATE1";
    system "mv -n $dir/logs/*.log $dir/logs/$DATE1";
}
system "/etc/init.d/nginx restart";

foreach my $dir(@list){
# remove old
    if(-d "$dir/logs/$DATE3"){
        system "/bin/sleep 60";
        system "/bin/rm -r $dir/logs/$DATE3";
    }
# archive
    if(-d "$dir/logs/$DATE2"){
        system "/bin/sleep 1800";
        system "/usr/bin/nice -20 /usr/bin/xz $dir/logs/$DATE2/*.log";
    }
}

exit;