LINUX.ORG.RU

Python и logrotate - как подружить?

 ,


0

1

Здравствуйте, всем, Есть скрипт, пишущий лог через

# create logger with 'spam_application'
logger = logging.getLogger('/var/log/therm/therm_ctl.log')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('/var/log/therm/therm_ctl.log')
fh.setLevel(logging.DEBUG)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)

И лог этот ротируется через logrotate. Но после первой же ротации скрипт продолжает писать в переименованный уже файл .1 Как это победить? Перезапускать скрипт после каждой ротации или что? Можно как-то самому питону сказать, чтобы он переоткрывал лог перед каждой записью, а после закрывал?

-Спасибо.

Нашел вот такое:

postrotate
    systemctl kill -s SIGHUP service-name.service
endscript

Это правильно? И почему не systemctl restart service-name.service?

DeadlineX
() автор топика
Ответ на: комментарий от vvn_black

Я извиняюсь, но что конкретно? Каждый раз close() и потом снова открывать новый? Или что? Раздел большой, там вообще про все написано, в том числе и как ротацию на питоне сделать. Но я хотел по-простому, через logrotate это делать.

DeadlineX
() автор топика
Ответ на: комментарий от DeadlineX

в том числе и как ротацию на питоне сделать

vvn_black ★★★★★
()
Ответ на: комментарий от DeadlineX

Говорят, в браузерах есть поиск по странице. Некоторые даже считают, что с его помощью можно найти на странице интересующую информацию. Брешут, наверное

hint: logrotate

router ★★★★★
()

Но после первой же ротации скрипт продолжает писать в переименованный уже файл .1 Как это победить?

А настроить logrotate не пробовал? Настрой copytruncate для своего лог-файла вместо переименования существующего лога и создания нового файла при каждой ротации.

sigurd ★★★★★
()
Ответ на: комментарий от DeadlineX

Юзать SIGHUP в таких случаях - правильно. Процесс, получил сигнал, должен закрыть дескрипторы файлов логов, и открыть заново данные файлы, после чего продолжить запись. Это стандарт правильного поведения в Unix-way.

Не знаю, умеет ли модуль logging по SIGHUP самостоятельно переоткрывать файл. Если не умеет, стоит копать в сторону https://www.programcreek.com/python/example/889/signal.SIGHUP и https://stackoverflow.com/questions/13839554/how-to-change-filehandle-with-python-logging-on-the-fly-with-different-classes-a чтоб при получении сигнала ваш скрипт переоткрывал хэндлер лога. В принципе, там ничего сложного.

lucentcode ★★★★★
()
Ответ на: комментарий от lucentcode

По SIGHUB сейчас и работает, но скрипт фактически перезапускается, а не просто продолжает работать. Минус в том, что в начале работы там накапливается некая инфа, и при ротации она обнуляется. Т.е. каждый новый лог, как бы, пишется с нуля. Это неудобно, но не смертельно. Попробую смотреть про ротацию логов в питоне… Мне просто logrotate больше нравится.

DeadlineX
() автор топика
Ответ на: комментарий от eternal_sorrow

Спасибо, вроде помогло. Я, конечно, мог бы внимательнее читать доку, там ровно это и написано про WatchedFileHandler

DeadlineX
() автор топика
Ответ на: комментарий от DeadlineX

но я не знаю, как это в logrotate записать.

Примерно, так:

/var/log/therm/therm_ctl.log
{
    missingok
    daily
    copytruncate
    rotate 7
    notifempty
}
sigurd ★★★★★
()
Ответ на: комментарий от sigurd

Спасибо! Я просто не понял что значит

Настрой copytruncate

Теперь понятно.

DeadlineX
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.