Проблема такая: Система Debia, почтовый релей, куча логов, которые забивают весь диск.
Настроил logrotate следующим образом:weekly
rotate 4
create
compress
include /etc/logrotate.d# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}/var/log/btmp {
missingok
monthly
create 0664 root utmp
rotate 1
}/var/log/mail.log {
missingok
daily
rotate 4
create
compress
}# system-specific logs may be configured here
/var/log/syslog {
missingok
daily
rotate 4
create
compress
}В результате лог mail.log обрабатывается вообще непонятно как. То он вообще не ротируется, то бывает проходит ротация, mail.log весит 0 и в него ничего не пишется, а увеличивается mail.log.1.gz. С логом syslog вообще ничего не происходит - он уже 5 гиг весит.
logrotate запускается каждый день по крону.
Что я делаю не так, что и где надо прописать, чтобы нормально работало?
>[оверквотинг удален]
>include /etc/logrotate.d
>
># no packages own wtmp, or btmp -- we'll rotate them here
>
>/var/log/wtmp {
> missingok
> monthly
> create 0664 root utmp
> rotate 1
>}Постротэйт может надо добавить...
postrotate
/bin/kill -HUP `cat /var/run/YOUR_MAIL.pid 2>/dev/null` 2> /dev/null || true
endscript
>[оверквотинг удален]
>}
>
>В результате лог mail.log обрабатывается вообще непонятно как. То он вообще не
>ротируется, то бывает проходит ротация, mail.log весит 0 и в него
>ничего не пишется, а увеличивается mail.log.1.gz. С логом syslog вообще ничего
>не происходит - он уже 5 гиг весит.
>
>logrotate запускается каждый день по крону.
>Что я делаю не так, что и где надо прописать, чтобы нормально
>работало?
>[оверквотинг удален]
>> missingok
>> monthly
>> create 0664 root utmp
>> rotate 1
>>}
>
>Постротэйт может надо добавить...
> postrotate
> /bin/kill -HUP `cat /var/run/YOUR_MAIL.pid 2>/dev/null` 2> /dev/null || true
> endscriptА это зачем? У меня проблемы с /var/log/syslog, что он не ротируется
А так же с /var/log/mail.log - он ротируется, но как-то странно. Ротация каждый день. 11 декабря ротация прошла и с 11 дек. вся инфа mail.log в файле mail.log, а файлы mail.log.1.gz и 2.gz так и не сдвигаются.
>А это зачем? У меня проблемы с /var/log/syslog, что он не ротируется
>
>А так же с /var/log/mail.log - он ротируется, но как-то странно. Ротация
>каждый день. 11 декабря ротация прошла и с 11 дек. вся
>инфа mail.log в файле mail.log, а файлы mail.log.1.gz и 2.gz так
>и не сдвигаются.А в логах крона что пишут по этому поводу?
сделать compress для файла в 5 Гиг - серьезное испытание. Есть ли свободное простанство на диске (> 5 G) ?
>
>>А это зачем? У меня проблемы с /var/log/syslog, что он не ротируется
>>
>>А так же с /var/log/mail.log - он ротируется, но как-то странно. Ротация
>>каждый день. 11 декабря ротация прошла и с 11 дек. вся
>>инфа mail.log в файле mail.log, а файлы mail.log.1.gz и 2.gz так
>>и не сдвигаются.
>
>А в логах крона что пишут по этому поводу?
>сделать compress для файла в 5 Гиг - серьезное испытание. Есть ли свободное простанство на диске (> 5 G) ?Так syslog я всё-таки прибил, щас новый уже надопился около 300 мб, с 12. Так за 3 дня и не было ротации.
Самое интересное, /var/log/messages ротация происходит, хотя вроде вообще нигде не прописано.
>А это зачем? У меня проблемы с /var/log/syslog, что он не ротируется
>
>А так же с /var/log/mail.log - он ротируется, но как-то странно. Ротация
>каждый день. 11 декабря ротация прошла и с 11 дек. вся
>инфа mail.log в файле mail.log, а файлы mail.log.1.gz и 2.gz так
>и не сдвигаются.Всё дело в том, как серверное приложение пишет логи. Есть 2 варианта:
1. для записи каждого лог-сообщения приложение открывает соответствующий лог-файл, дописывает в конец сообщение и закрывает файл. Но такие открывания-закрывания файла увеличивают задержки в работе приложения, (особенно если происходит частое записывание в лог) и, соответственно, нагрузку на сервер;
2. приложение открывает лог-файл 1 раз на старте, и постоянно держит его открытым; соответственно, нет издержек на постоянное открывание-закрывание лог-файла, но есть другие "грабли" - например ротация таких логов, как в Вашем случае. Дело в том, что в Юникс-подобных системах приложения обращаются к файлам по номеру inode, а не по имени. В момент открытия лог файла файловая система по имени файла определяет его inod и возвращает приложению, которое запоминает inod, и в дальнейшем обращается к файлу уже по этому inode. Тоесть, как только файл открыт, его можно переименовывать, перемещать по диску (в пределах одного дискового раздела) - приложение всё равно найдёт его, т. к. inod остаётся неизменным. Вторая возможная неприятность - когда при открытом лог-файле происходит ротация лога, и он удаляется. Тогда приложение, открывшее inod, или зависнет, или тупо свалится, или (реже) останется работать, но перестанет писать логи.В случае с Вашим /var/log/mail.log происходит именно то, что описано в п. 2 выше - МТА открыл файл, запомнил inod, и ему начхать, что Вы ротейтаете логи. Поэтому необходимо вставить в postrotate-секцию перезапуск приложения, чтоб оно открывало новый лог-файл после ротаци предыдущего (имя файла будет то же, но inod уже другой).
>[оверквотинг удален]
>найдёт его, т. к. inod остаётся неизменным. Вторая возможная неприятность -
>когда при открытом лог-файле происходит ротация лога, и он удаляется. Тогда
>приложение, открывшее inod, или зависнет, или тупо свалится, или (реже) останется
>работать, но перестанет писать логи.
>
>В случае с Вашим /var/log/mail.log происходит именно то, что описано в п.
>2 выше - МТА открыл файл, запомнил inod, и ему начхать,
>что Вы ротейтаете логи. Поэтому необходимо вставить в postrotate-секцию перезапуск приложения,
>чтоб оно открывало новый лог-файл после ротаци предыдущего (имя файла будет
>то же, но inod уже другой).пора-бы знать что у debian'а есть свои небольшие приколы относительно основных журнальных файлов
man syslogd-listfiles
>>[оверквотинг удален]Ну а я вот к сожалению не знал. Так значит мне вообще не надо настраивать ротацию mail.log и syslog в logrotate? Или надо всё это настраивать через syslogd-listfiles? Что-то я не разобрался с этими костылями.
>пора-бы знать что у debian'а есть свои небольшие приколы относительно основных журнальных
>файлов
>man syslogd-listfiles
>[оверквотинг удален]
>найдёт его, т. к. inod остаётся неизменным. Вторая возможная неприятность -
>когда при открытом лог-файле происходит ротация лога, и он удаляется. Тогда
>приложение, открывшее inod, или зависнет, или тупо свалится, или (реже) останется
>работать, но перестанет писать логи.
>
>В случае с Вашим /var/log/mail.log происходит именно то, что описано в п.
>2 выше - МТА открыл файл, запомнил inod, и ему начхать,
>что Вы ротейтаете логи. Поэтому необходимо вставить в postrotate-секцию перезапуск приложения,
>чтоб оно открывало новый лог-файл после ротации предыдущего (имя файла будет
>то же, но inod уже другой).Огромное спасибо за разъяснения! Но как мне сделать это без перезагрузки postfix'a ?
И почему у меня автоматически не срабатывает логротейт, пока я вручную его не запущу?
>И почему у меня автоматически не срабатывает логротейт, пока я вручную его
>не запущу?Сложно сказать почему логротейт не срабатывает. Может просто crond не запущен?
>Но как мне сделать это без перезагрузки postfix'a ?Именно так, как Вам подсказали ранее - вставить соответствующую команду рестарта постфикса в конфиг логротейта. И никак иначе.
>>Но как мне сделать это без перезагрузки postfix'a ?
>
>Именно так, как Вам подсказали ранее - вставить соответствующую команду рестарта постфикса
>в конфиг логротейта. И никак иначе.В принципе, если МТА очень критичный и перезапуск строго противопоказан, то можно настроить syslogd на запись логов мейлсервера на удаленную машину. Тогда ротация логов на удаленной машине никоим образом не будет влиять на Ваш мейлсервер. А если придерживаться локальной записи логов и ротации, то действительно, перезапуск постфикса при ротации логов обязателен.
man 5 syslog.conf
>
>>И почему у меня автоматически не срабатывает логротейт, пока я вручную его
>>не запущу?
>
>Сложно сказать почему логротейт не срабатывает. Может просто crond не запущен?Да наверно crond запущен. Он и в /etc/rc3 есть и есть скрипт, который чистин папку с карантином ночью, запускается из крона - каждый день отрабатывает.
>>Но как мне сделать это без перезагрузки postfix'a ?
>
>Именно так, как Вам подсказали ранее - вставить соответствующую команду рестарта постфикса
>в конфиг логротейта. И никак иначе.гм...и для sysloga ?
в redhat есть полезные ключики у logrotate:
из терминала:
logrotate -d -v -v -v /etc/logrotate.conf
может показать узкое место...как в debian - не знаю...
>в redhat есть полезные ключики у logrotate:
>из терминала:
>logrotate -d -v -v -v /etc/logrotate.conf
>может показать узкое место...
>
>как в debian - не знаю...Да запускал я это:
вот кусок из вывода команды /usr/sbin/logrotate -v -f /etc/logrotate.conf
rotating pattern: /var/log/mail.log forced from command line (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/mail.log
log needs rotating
rotating log /var/log/mail.log, log->rotateCount is 4
previous log /var/log/mail.log.1 does not exist
renaming /var/log/mail.log.4.gz to /var/log/mail.log.5.gz (rotatecount 4, logstart 1, i 4),
old log /var/log/mail.log.4.gz does not exist
renaming /var/log/mail.log.3.gz to /var/log/mail.log.4.gz (rotatecount 4, logstart 1, i 3),
old log /var/log/mail.log.3.gz does not exist
renaming /var/log/mail.log.2.gz to /var/log/mail.log.3.gz (rotatecount 4, logstart 1, i 2),
renaming /var/log/mail.log.1.gz to /var/log/mail.log.2.gz (rotatecount 4, logstart 1, i 1),
renaming /var/log/mail.log.0.gz to /var/log/mail.log.1.gz (rotatecount 4, logstart 1, i 0),
old log /var/log/mail.log.0.gz does not exist
log /var/log/mail.log.5.gz doesn't exist -- won't try to dispose of it
renaming /var/log/mail.log to /var/log/mail.log.1
creating new log mode = 0640 uid = 0 gid = 4rotating pattern: /var/log/syslog forced from command line (4 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/syslog
log needs rotating
rotating log /var/log/syslog, log->rotateCount is 4
previous log /var/log/syslog.1 does not exist
renaming /var/log/syslog.4.gz to /var/log/syslog.5.gz (rotatecount 4, logstart 1, i 4),
old log /var/log/syslog.4.gz does not exist
renaming /var/log/syslog.3.gz to /var/log/syslog.4.gz (rotatecount 4, logstart 1, i 3),
old log /var/log/syslog.3.gz does not exist
renaming /var/log/syslog.2.gz to /var/log/syslog.3.gz (rotatecount 4, logstart 1, i 2),
old log /var/log/syslog.2.gz does not exist
renaming /var/log/syslog.1.gz to /var/log/syslog.2.gz (rotatecount 4, logstart 1, i 1),
old log /var/log/syslog.1.gz does not exist
renaming /var/log/syslog.0.gz to /var/log/syslog.1.gz (rotatecount 4, logstart 1, i 0),
old log /var/log/syslog.0.gz does not exist
log /var/log/syslog.5.gz doesn't exist -- won't try to dispose of it
renaming /var/log/syslog to /var/log/syslog.1
creating new log mode = 0644 uid = 0 gid = 0
В кроне у меня в папочек /etc/cron.daily лежит запускной файл logrotate с содержимым : /usr/sbin/logrotate /etc/logrotate.conf
Но логи mail.log и syslog не ротировались уже больше недели, пока я вручную не запустил тот же /usr/sbin/logrotate /etc/logrotate.conf, правда всё стало писаться в mail.log.1 и syslog.1.
>[оверквотинг удален]
>>И почему у меня автоматически не срабатывает логротейт, пока я вручную его
>>не запущу?
>
>Сложно сказать почему логротейт не срабатывает. Может просто crond не запущен?
>
>
>>Но как мне сделать это без перезагрузки postfix'a ?
>
>Именно так, как Вам подсказали ранее - вставить соответствующую команду рестарта постфикса
>в конфиг логротейта. И никак иначе.постфикс не надо рестартить :)
надо релоад сислогу сделать
в сусе:
postrotate
/etc/init.d/syslog reload
>[оверквотинг удален]
>>>Но как мне сделать это без перезагрузки postfix'a ?
>>
>>Именно так, как Вам подсказали ранее - вставить соответствующую команду рестарта постфикса
>>в конфиг логротейта. И никак иначе.
>
>постфикс не надо рестартить :)
>надо релоад сислогу сделать
>в сусе:
>postrotate
> /etc/init.d/syslog reloadЭто конечно всё хорошо, но:
1. По крону почему то logrotate не срабатывает (различные скрипты по крону у меня отлично работают).
2. syslog reload это конечно хорошо, но постфикс (если его не рестартить) тоже пишет лог после логротейта в тот, который был сдвинут, а не в новый.
>[оверквотинг удален]
>>postrotate
>> /etc/init.d/syslog reload
>
>Это конечно всё хорошо, но:
>
>1. По крону почему то logrotate не срабатывает (различные скрипты по крону
>у меня отлично работают).
>2. syslog reload это конечно хорошо, но постфикс (если его не рестартить)
>тоже пишет лог после логротейта в тот, который был сдвинут, а
>не в новый.Лог пишет не постфикс, а сислог, поэтому надо на сислог смотреть.
Вот скрипт который у меня на системе запускается:
#!/bin/shTMPF=`mktemp /tmp/logrotate.XXXXXXXXXX`
/usr/sbin/logrotate /etc/logrotate.conf 2>&1 | tee $TMPF
EXITVALUE=${PIPESTATUS[0]}if [ $EXITVALUE != 0 ]; then
# wait a sec, we might just have restarted syslog
sleep 1
# tell what went wrong
/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
/bin/logger -t logrotate -f $TMPF
firm -f $TMPF
exit 0
>[оверквотинг удален]
>restarted syslog
> sleep 1
> # tell what went wrong
> /bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
>
> /bin/logger -t logrotate -f $TMPF
>fi
>
>rm -f $TMPF
>exit 0Опять же: это никак не отвечает на мой вопрос.
вот конфиг, который работает, если запускать логротейт приведенным выше скриптом, попробуйте, может и у вас заработает, а?
/var/log/warn /var/log/messages /var/log/allmessages /var/log/localmessages /var/log/firewall {
compress
dateext
maxage 365
rotate 99
missingok
notifempty
size +4096k
create 640 root root
sharedscripts
postrotate
/etc/init.d/syslog reload
endscript
}/var/log/mail /var/log/mail.info /var/log/mail.warn /var/log/mail.err {
compress
dateext
maxage 365
rotate 99
missingok
notifempty
size +4096k
create 640 root root
sharedscripts
postrotate
/etc/init.d/syslog reload
endscript
}/var/log/news/news.crit /var/log/news/news.err /var/log/news/news.notice {
compress
dateext
maxage 365
rotate 99
missingok
notifempty
size +4096k
create 640 news news
sharedscripts
postrotate
/etc/init.d/syslog reload
endscript
}
>[оверквотинг удален]
> rotate 99
> missingok
> notifempty
> size +4096k
> create 640 news news
> sharedscripts
> postrotate
> /etc/init.d/syslog reload
> endscript
>}Да, добавил в свой logrotate.conf в секции с mail.log и syslog
postrotate
/etc/init.d/postfix reload
endscript
иpostrotate
/etc/init.d/syslog reload
endscriptВручную запустил logrotate : та же картина. Созданы файлы mail.log.1 и syslog.1, куда скорировались mail.log и syslog, соответственно, но запись логов идёт в mail.log.1 и syslog.1, а mail.log syslog пустые
>[оверквотинг удален]
>endscript
>и
>
>postrotate
> /etc/init.d/syslog reload
>endscript
>
>Вручную запустил logrotate : та же картина. Созданы файлы mail.log.1 и syslog.1,
>куда скорировались mail.log и syslog, соответственно, но запись логов идёт в
>mail.log.1 и syslog.1, а mail.log syslog пустые/etc/init.d/postfix reload - не нужен, лог пишет сислог, он же и открывает файлы.
/etc/init.d/syslog reload попробуйте заменить на /etc/init.d/syslog restart
+ у вас точно syslog крутится не syslog-ng или rsyslog? тогда надо другой процесс релоадить.
лично у меня (RH5) в /etc/logrotate.d/syslog прописано так:/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
>
>лично у меня (RH5) в /etc/logrotate.d/syslog прописано так:
>
>/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
> sharedscripts
> postrotate
> /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
> /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
> endscript
>}заметьте, ни sendmail, ни postfix не упомянуты.
>[оверквотинг удален]
>>
>>/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
>> sharedscripts
>> postrotate
>> /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
>> /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
>> endscript
>>}
>
>заметьте, ни sendmail, ни postfix не упомянуты.заметил. У меня именно syslogd пишет сообщения от senmail в /var/log/file
Думаю, у Вас тоже. Вы своими logrotate делаете mv file file1, но файл file был уже открыт syslog'ом. И его inode от mv не меняется....
miss click. sorry
>miss click. sorryПростите, но не понял суть Вашего сообщения.
>miss click. sorry?
>>miss click. sorry
>
>?перевод: не туда написал. извините