Я пытаюсь создать отдельный файл журнала для приложения в Linux. До сих пор я создал скрипт .conf для разделения журнала в пользовательском файле журнала на основе имени программы, и он работает правильно.
Но я хочу ограничить размер файла журнала 10K, и я использую $outchannel
для этой цели. Сценарий хранится в формате /etc/rsyslog.d/00-abc_log.conf
:
$outchannel o_abc, /var/log/abc.log, 10240, /home/xyz/logrot
if $programname == 'abc' then :omfile:$o_abc
, а сценарий /home/xyz/logrot
содержит следующее:
mv -f /var/log/abc.log /var/log/abc.log.1
Ниже предела в 10 К логирование работает правильно, но после превышения журнала Ограничение размера в 10 КБ, файл abc.log.1 не генерируется и регистрация в abc.log прекращается.
Если это имеет значение, моя система работает под управлением Xubuntu 12.04 rsyslog-5.8.6
.
Спасибо заранее.
Ваша проблема возникает из-за того, что в приложении по-прежнему открыт дескриптор файла после его перемещения в файловой системе. Если вы не можете сказать программе перезапустить ведение журнала непосредственно после перемещения (обычно для демонов, есть сигнал для этого, например SIGHUP
), вам придется использовать другой метод вращения, чем перемещение файлов, в которые записываются в это время [ 115]
Я предлагаю использовать logrotate
следующим образом. Не проверял, так как вы не поделились приложением.
Создайте свой собственный файл конфигурации logrotate, например, abclogrotate.conf
:
/var/log/abc.log {
# don't use time based rotation, but size-based
size 10k
# don't move, but copy-and-truncate so the application won't have to be
# told that the file has moved.
copytruncate
# maximum of one old file
rotate 1
# counting old files starts at 1 rather than 0
start 1
# don't use compression
nocompress
}
Теперь вызывайте logrotate так: logrotate /path/to/abclogrotate.conf
, а не ваш собственный скрипт.