У меня есть файл конфигурации logrotate.d, который выглядит примерно так:
/home/myapp/log/* {
daily
compress
dateext
ifempty
delaycompress
olddir /home/myapp/baklog
}
Есть несколько конкретных файлов журналов, к которым я хочу применить дополнительные правила, такие как «почта». Как я могу применить дополнительные правила только к некоторым файлам?
Если я добавлю еще одно правило выше, соответствующее дополнительным файлам (например, /home/myapp/log/warning.log { ... }
, Я получаю сообщение об ошибке error: /etc/logrotate.d/myapp:3 duplicate log entry for /home/myapp/log/warning.log
.
Как я могу указать несколько правил, которые совпадают с конкретными файлами, перекрывая друг друга?
Как отмечает Эфир, перекрывающиеся пути намеренно запрещены.
Если вы хотите и можете бежать logrotate
с опцией оболочки extglob
включен (shopt -s extglob
в корневой среде работает crontab
logrotate
), или он уже установлен (проверьте с помощью shopt extglob
в той же среде), то вы можете создать явные исключения пути, которые logrotate.conf
не предусматривает иное. Вам нужно будет объявить каждое такое исключение. Конечно, лучшим решением будет перенастроить систему ведения журнала для использования отдельных каталогов для файлов, требующих специальной обработки, если это возможно.
С участием extglob
вы можете заявить следующее:
/home/myapp/log/!(warning.log) {
daily
compress
dateext
ifempty
delaycompress
olddir /home/myapp/baklog
}
... и !(warning.log)
будет соответствовать всем файлам, кроме этого, что позволит вам написать для него определенные правила. Это беспорядочно и требует некоторого обслуживания, поэтому, опять же, гораздо лучше, если вы можете настроить систему ведения журнала своего приложения для записи высокоприоритетных или других специальных файлов журнала в отдельный каталог.
В большинстве дистрибутивов это невозможно.
Похоже, что в Debian было принято решение, что разрешать переопределение правила для определенного файла было плохо, потому что при установке пакетов стало обычным делом ошибочно устанавливать повторяющиеся правила, и разработчики logrotate хотели отметить это как ошибку.
Так или иначе, будь то использование более конкретных подстановочных знаков (log/[a-hj-z]*
вместо того log/*
), поэтому общее правило не применяется к исключительным файлам журнала или путем изменения конфигурации вашего приложения для помещения исключительных файлов журнала в другой каталог, вы должны решить эту проблему, чтобы не было нескольких правил, нацеленных на один и тот же файл журнала.
Ты не можешь.
Упомянутый shopt -s extglob
вариант сейчас не работает. Несколько часов я безуспешно пытался его использовать.
Протестировано на Debian 10 (buster, bash версии 5.0-4, logrotate версии 3.14.0-4) и Manjaro (на основе Arch).
Проблема с logrotate GitHub чтобы включить такую поддержку extglob, но пока нет хороших новостей.