Назад | Перейти на главную страницу

Как автоматически очищать журналы с отметкой даты

У меня есть веб-сервер apache с различными виртуальными хостами. Каждый виртуальный хост регистрирует файлы с отметками даты с помощью cronolog. В результате у меня получается много таких файлов:

----rw-r-- 1 root     root      467894 2013-02-01 13:43 2013-02-01-tracg.dev.local-access.log
----rw-r-- 1 root     root         222 2013-02-01 01:09 2013-02-01-tracg.dev.local-error.log
----rw-r-- 1 root     root         222 2013-02-02 01:10 2013-02-02-tracg.dev.local-error.log
----rw-r-- 1 root     root         333 2013-02-03 06:47 2013-02-03-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       39574 2013-02-04 14:20 2013-02-04-tracg.dev.local-access.log
----rw-r-- 1 root     root         444 2013-02-04 08:24 2013-02-04-tracg.dev.local-error.log
----rw-r-- 1 root     root         444 2013-02-05 12:14 2013-02-05-tracg.dev.local-error.log
----rw-r-- 1 root     root       98135 2013-02-06 13:30 2013-02-06-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-06 09:13 2013-02-06-tracg.dev.local-error.log
-rw-r--r-- 1 root     root        8872 2013-02-07 13:55 2013-02-07-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-07 02:00 2013-02-07-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         666 2013-02-08 14:31 2013-02-08-tracg.dev.local-error.log
----rw-r-- 1 root     root         192 2013-02-09 01:08 2013-02-09-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         530 2013-02-09 01:08 2013-02-09-tracg.dev.local-error.log
----rw-r-- 1 root     root         192 2013-02-10 01:08 2013-02-10-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         641 2013-02-10 06:32 2013-02-10-tracg.dev.local-error.log
----rw-r-- 1 root     root       64565 2013-02-11 13:56 2013-02-11-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         752 2013-02-11 06:28 2013-02-11-tracg.dev.local-error.log
----rw-r-- 1 root     root       54988 2013-02-12 11:56 2013-02-12-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         752 2013-02-12 08:45 2013-02-12-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       15003 2013-02-13 11:19 2013-02-13-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-13 10:48 2013-02-13-tracg.dev.local-error.log
----rw-r-- 1 root     root       32819 2013-02-14 15:43 2013-02-14-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-14 14:29 2013-02-14-tracg.dev.local-error.log
----rw-r-- 1 root     root      135665 2013-02-15 13:53 2013-02-15-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-15 11:39 2013-02-15-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-02-16 01:10 2013-02-16-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-02-17 06:33 2013-02-17-tracg.dev.local-error.log
-rw-r--r-- 1 root     root       30763 2013-02-18 14:15 2013-02-18-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-18 09:00 2013-02-18-tracg.dev.local-error.log
----rw-r-- 1 root     root       15058 2013-02-19 09:37 2013-02-19-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-19 09:16 2013-02-19-tracg.dev.local-error.log
----rw-r-- 1 root     root      132587 2013-02-20 15:55 2013-02-20-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         444 2013-02-20 01:11 2013-02-20-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         666 2013-02-21 09:07 2013-02-21-tracg.dev.local-error.log
-rw-r--r-- 1 root     root      226997 2013-02-22 15:36 2013-02-22-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-22 08:26 2013-02-22-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-02-23 01:12 2013-02-23-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-02-24 06:48 2013-02-24-tracg.dev.local-error.log
----rw-r-- 1 root     root      130913 2013-02-25 11:36 2013-02-25-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-25 11:37 2013-02-25-tracg.dev.local-error.log
----rw-r-- 1 root     root       21542 2013-02-26 14:43 2013-02-26-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-26 15:39 2013-02-26-tracg.dev.local-error.log
----rw-r-- 1 root     root       99698 2013-02-27 13:28 2013-02-27-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         444 2013-02-27 01:13 2013-02-27-tracg.dev.local-error.log
----rw-r-- 1 root     root      111632 2013-02-28 13:57 2013-02-28-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-02-28 11:55 2013-02-28-tracg.dev.local-error.log
----rw-r-- 1 root     root      205731 2013-03-01 13:30 2013-03-01-tracg.dev.local-access.log
-rw-r--r-- 1 root     root        1332 2013-03-01 14:31 2013-03-01-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         444 2013-03-02 01:11 2013-03-02-tracg.dev.local-error.log
-rw-r--r-- 1 root     root         555 2013-03-03 06:35 2013-03-03-tracg.dev.local-error.log
----rw-r-- 1 root     root      211616 2013-03-04 10:42 2013-03-04-tracg.dev.local-access.log
-rw-r--r-- 1 root     root         666 2013-03-04 10:42 2013-03-04-tracg.dev.local-error.log

Это все нормально, однако я хотел бы, чтобы задание cron автоматически архивировало все файлы журналов, которые в настоящее время не используются. Я не могу просто сделать: gzip -9 / data / www / virtual //журнал/.журнал

Это также заархивирует текущий открытый файл журнала. Итак, как это сделать, чтобы я сжал только те, которые в данный момент не используются?

Один из способов:

find /data/www/virtual/log/ -name '*.log' -mtime +2 -exec gzip {} +

Это сжимает любой файл, заканчивающийся на .log который не изменялся как минимум два дня.

Другой способ:

gzip $(date --date="yesterday" "+/data/www/virtual/log/%Y-%m-*.log")

Это вычисляет вчерашнюю дату и сжимает все файлы, которые начинаются с этой даты и заканчиваются на .log.

Помните, что $() и % не будет работать в cron, потому что $() это вещь bash и % имеет особое значение в crontabs. Поместите это в скрипт и вызовите скрипт из задания cron. Собственно, сделайте это для всех этих методов.

Еще один способ:

for FILE in /data/www/virtual/log/*.log
do
  if [ `fuser -s $FILE` ]
  then
    gzip $FILE
  fi
done

Это сжимает все файлы, заканчивающиеся на .log и в настоящее время не открыты никаким процессом.

Возможно, можно будет настроить logrotate чтобы справиться с этим для вас, все еще используя cronolog. Я никогда не использовал logrotate с файлами журнала, которые каждый день имеют разные имена, но вы можете указать *.log в файлах конфигурации, так что это возможно.

В качестве альтернативы вы можете просто бросить cronolog, входить в один и тот же файл все время и иметь logrotate перемещайте их каждый день. Это также поможет удалить самые старые, чтобы у вас был относительно стабильный объем используемого дискового пространства.

Пытаться:

ls -d /path/to/[0-9]*tracg.dev.local-*.log | sort -r | sed '1,2d' | xargs gzip -9

Это будет быстрее, чем проверка открытия каждого файла, но предполагается, что первые два из перечисленных (отсортированные в обратном алфавитном порядке; последние два будут вверху) - это те, которые вы хотите пропустить.

[Команда sed удаляет строки 1-2]

logrotate принимает подстановочные знаки в файле man "man logrotate". Это пример подстановочного знака для демона INN usenet:

   /var/log/news/* {
       monthly
       rotate 2
       olddir /var/log/news/old
       missingok
       postrotate
           kill -HUP ‘cat /var/run/inn.pid‘
       endscript
       nocompress
   }

надеюсь, это поможет

Пример сценария Bash для перемещения старых файлов журнала:

logdir='/data/www/virtual//log/'
year=`date +%Y`
touch -t `date +%m%d0000` /tmp/tdate
            for i in $(find $logdir -maxdepth 1 -type f ! -newer /tmp/tdate)
                    do
                            month=`ls -al $i | awk '{print $6}'`
                            day=`ls -al $i | awk '{print $7}'`
                            ls -al $i | awk '{print $8}' | grep ":" > /dev/null
                            if [ $? = 0 ]
                                    then
                                            mkdir -p $logdir/previous/$day-$month-$year
                                            mv $i $logdir/previous/$day-$month-$year
                                    else
                                            year1=`ls -al $i | awk '{print $8}'`
                                            mkdir -p $logdir/previous/$day-$month-$year1
                                            mv $i $logdir/previous/$day-$month-$year1
                            fi
                    done
    rm -rf /tmp/tdate

Создайте предыдущий каталог в каталоге / data / www / virtual // log /. Все журналы старше сегодняшней даты будут перемещены в предыдущий каталог. Внутри предыдущего каталога он снова создаст каталоги, а файлы журналов будут находиться в каталогах с датой их принадлежности.

Или простое решение, используйте Logrotate