Linux - Logrotate


Установка

Ubuntu 16.04 - установлена по умолчанию

Настройка

Стандартый конфиг - /etc/logrotate.conf

logrotate

Ключи
  • -v, --verbose = выводить отладочную информацию
  • -d, --debug = запустить но не ротировать логи
  • -f, --force = запустить принудительно
  • -d =
    
                    content
                

Конфиг

Пути до логов

Первым параметром указывается путь до лога который ротируется. Пример


/var/log/nginx.access.log {}

либо несколько


/var/log/nginx.access.log /var/log/nginx.error.log {}

Также можно по маске


/var/log/nginx.*.log {}

Дира в которой лежит лог, должна иметь права 755 иначе logrotate будет угаться типа


error: skipping "/var/log/nginx.access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.
    

Основные параметры

  • hourly - каждый час;
  • daily - каждый день;
  • weekly - каждую неделю;
  • monthly - каждый месяц;
  • yearly - каждый год.

olddir - дира куда складываются логи

missingok - не выдавать ошибки, если лог файла не существует

compress - указывает, что старые логи необходимо сжимать

delaycompress - не сжимать последний и предпоследний лог

rotate - указывает сколько старых логов нужно хранить, в параметрах передается количество

Если не указать параметр rotate то логи буду удаляться сразу!

copytruncate - не удалять исходный лог, а обрезать

create - указывает, что необходимо создать пустой лог файл после перемещения старого

copy - создать копию лога не меняя исходый

Программы, на подобие nginx, не пишут в новый файл. Нужно либо делать copytruncate, либо отправлять SIGHUB в postrotate см. ниже

size - размер лога, когда он будет перемещен; k - билобайт, M - мегабайт, G - гигабайт

Если не указать размер то не будет ротироваться

Форматы

dateext - добавляет дату ротации после заголовка старого лога

dateformat - формат даты, см date. По умолчанию добавляет ‘-yyyymmdd’

Не все форматы поддерживаться, например в ubuntu не понял %H - дни, хотя в date норм

Пишут что доступен в версии 3.9.0

start - номер, с которого будет начата нумерация старых логов. В место dateext!

Разное

mail - отправлять Email после завершения ротации; TODO

maxage count - выполнять ротацию логов, если они старше, чем указано в днях

extension - сохранять оригинальный лог файл после ротации, если у него указанное расширение; TODO

notifempty - Не сдвигать журнал, если он пуст (это переопределяет параметр ifempty).

Скрипты

prerotate/endscript - выполнить bash скрипт перед ротацией но до сжатия

postrotate/endscript - выполнить bash скрипт после ротации но до сжатия

sharedscripts - выполнить скрипт только один раз, если используется маска

nosharedscripts - Выполнять скрипты prerotate и postrotate для каждого обработанного журнала

Если указана маска и нужно как-то определить какой именно файл сейчас обрабатывается в скрипте, то полный путь до лога находиться в переменной $1

Пример


$ cat /etc/logrotate.d/nginx.main.conf
/var/log/nginx.*.log {
    olddir /var/log/archive/
    hourly
    compress
    delaycompress
    missingok
    # create
    copytruncate
    size 1k
    rotate 3
    start 1
    # dateext
    # dateformat .%Y-%m-%d-%H-%s
    prerotate
        echo "Now rotating log = $1" >> /var/log/logrotate.pre.info
    endscript
    postrotate
        echo "Rotate is done; log = $1" >> /var/log/logrotate.post.info
    endscript
}
...
$ sudo logrotate /etc/logrotate.d/nginx.main.conf
...
$ ls -lh /var/log/nginx.*.log /var/log/archive/
-rw-r--r-- 1 root root  12K Aug 13 22:13 /var/log/nginx.access.log
-rw-r--r-- 1 root root    0 Aug 13 20:44 /var/log/nginx.error.log

/var/log/archive/:
total 16K
-rw-r--r-- 1 root root 6.7K Aug 13 22:12 nginx.access.log.1
-rw-r--r-- 1 root root  720 Aug 13 22:11 nginx.access.log.2.gz
-rw-r--r-- 1 root root  319 Aug 13 22:08 nginx.access.log.3.gz
...