В 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;