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

Как указать исключения из настроек подстановочных знаков в файле конфигурации logrotate?

Для моих файлов журнала проблема состоит в том, что все файлы, кроме одного (или нескольких), используют одну и ту же конфигурацию, а остальные имеют другую. Я попытался понять это, задав общую конфигурацию для всех файлов, а затем перезаписав эту конфигурацию для нескольких конкретных файлов, например:

/var/log/mylogs/*.log {
                   size 1000k
                   copytruncate
                   create 0644 root root
                   rotate 99
                   compress
                   missingok
}

/var/log/mylogs/thatonespecial.log {
                   size 1000k
                   copytruncate
                   create 0644 myuser mygroup
                   rotate 99
                   compress
                   missingok
}

Однако это вызывает ошибку:

error: /var/log/mylogs/logrotate.conf:10 duplicate log entry for /var/log/mylogs/thatonespecial.log

Как мне правильно поступить в такой ситуации? Я, конечно, не хочу перечислять большое количество стандартных файлов журнала по отдельности, поэтому использование конфигурации с подстановочными знаками кажется мне разумным. Но как я могу указать исключение среди файлов с подстановочными знаками?

Самый элегантный ответ - поставить thatonespecial.log в отдельном каталоге, чтобы он не соответствовал подстановочному знаку.

Если это не сработает, вы можете использовать шарики чтобы сузить подстановочный знак. Это беспорядочно, но если вы абсолютно не можете переместить файл, это, вероятно, ваш единственный реальный вариант. Что-то вроде этого:

/var/log/mylogs/[!t][!h]*.log

Соответствует любым файлам .log, в имени которых содержится не менее 2 символов, не начинающихся с "th".

Вроде бы перезапись правил реализована и теперь работает:

$ logrotate --version
logrotate 3.8.7

$ cat /etc/logrotate.d/test
# rotate application logs for 40 days by default
/home/myapp/log/*.log
/home/myapp/log/*/*.log
{
    daily
    compress
    delaycompress
    rotate 40
}

# rotate access logs for 1 year
/home/myapp/log/access/*.log {
    daily
    compress
    delaycompress
    rotate 365
}

$ logrotate  -d /etc/logrotate.d/test
reading config file /etc/logrotate.d/test

Handling 2 logs

rotating pattern: /home/myapp/log/*.log
/home/myapp/log/*/*.log
 after 1 days (40 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.

rotating pattern: /home/myapp/log/access/*.log  after 1 days (365 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.

При тестировании на моем локальном logrotate (версия 3.7.8) возникла ошибка:

$ cat logr.conf 
# rotate application logs for 40 days by default
/home/myapp/log/*.log
/home/myapp/log/*/*.log
{
    daily
    compress
    delaycompress
    rotate 40
}

# rotate access logs for 1 year
/home/myapp/log/access/*.log {
    daily
    compress
    delaycompress
    rotate 365
}

$ logrotate -d logr.conf 
reading config file logr.conf
reading config info for /home/myapp/log/*.log
/home/myapp/log/*/*.log

error: logr.conf:12 duplicate log entry for /home/myapp/log/access/api_access.log
error: found error in /home/myapp/log/access/*.log , skipping
removing last 1 log configs

...

Если вы знаете имена всех журналов, вы также можете указать их вместе в одном правиле:

/var/log/mylogs/{file1,file2,file3,file4,file5}.log {
    size 1000k
    copytruncate
    create 0644 root root
    rotate 99
    compress
    missingok
}

/var/log/mylogs/thatonespecial.log {
    size 1000k
    copytruncate
    create 0644 myuser mygroup
    rotate 99
    compress
    missingok
}