[Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 25.03.10 11:58
Оценка:
Привет!

Никак не работает. Например, такой код:

#! /usr/local/bin/python

import logging
import logging.handlers

h = logging.handlers.TimedRotatingFileHandler(filename = "old_log.log", when = "s", interval=10, backupCount=4)
h.setFormatter(logging.Formatter("%(asctime)s %(levelname)-8s %(name)s %(message)s"))
logging.root.addHandler(h)
logging.root.setLevel(logging.DEBUG)

logging.getLogger("root").info("TestMessage")


Должен по идее раз в 10 секунд создавать новый лог. Не получается. Ни под виндой, ни под FreeBSD. Вариант с установкой ротации на день недели тоже не работают.

А вот по размеру -- как часы.

#! /usr/local/bin/python

import logging
import logging.handlers

h = logging.handlers.RotatingFileHandler(filename = "old_log.log", maxBytes=100, backupCount=4)
h.setFormatter(logging.Formatter("%(asctime)s %(levelname)-8s %(name)s %(message)s"))
logging.root.addHandler(h)
logging.root.setLevel(logging.DEBUG)

logging.getLogger("root").info("TestMessage")


Но хочется всё же по времени. Может я что-то делаю неправильно?
Делай что должно, и будь что будет
Re: [Python] Не работает TimedRotatingFileHandler
От: Temoto  
Дата: 25.03.10 18:55
Оценка: -1
SH>Никак не работает. Например, такой код:

SH>Но хочется всё же по времени. Может я что-то делаю неправильно?


Вы играете в <del>бога</del>админа.
Просто пишите в /dev/log или удалённый сислог с помощью SyslogHandler, а там уже разберутся (или вы разберётесь) в какие файлы это складывать и как часто ротировать.
Re[2]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 25.03.10 18:59
Оценка:
Здравствуйте, Temoto, Вы писали:

T>Вы играете в <del>бога</del>админа.


Это делается так

T>Просто пишите в /dev/log или удалённый сислог с помощью SyslogHandler, а там уже разберутся (или вы разберётесь) в какие файлы это складывать и как часто ротировать.


Если кратко, то религия не позволяет.
Расписывать ситуацию лень, буду рад услышать ответы по теме вопроса.
Делай что должно, и будь что будет
Re: [Python] Не работает TimedRotatingFileHandler
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.10 07:51
Оценка: 1 (1)
Здравствуйте, SergH, Вы писали:

Вообще-то исходный код модуля лежит открыто, можно просто почитать. Я успел заметить (в 2.6) что внутри методов есть, например, проверка self.when=='MIDNIGHT', хотя такое значение через конструктор задать нельзя. Возможно, этот модуль настолько редко используется, что никто не нарывался на ошибку?
The God is real, unless declared integer.
Re[2]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 26.03.10 11:45
Оценка:
Здравствуйте, netch80, Вы писали:

N>Вообще-то исходный код модуля лежит открыто, можно просто почитать. Я успел заметить (в 2.6) что внутри методов есть, например, проверка self.when=='MIDNIGHT', хотя такое значение через конструктор задать нельзя. Возможно, этот модуль настолько редко используется, что никто не нарывался на ошибку?


Да, спасибо за мысль, посмотрел код. Это не ошибка, это дизайн.

В конструкторе устанавливается поле self.rolloverAt
А потом оно используется так:

    def shouldRollover(self, record):
        """
        Determine if rollover should occur

        record is not used, as we are just comparing times, but it is needed so
        the method siguratures are the same
        """
        t = int(time.time())
        if t >= self.rolloverAt:
            return 1
        #print "No need to rollover: %d, %d" % (t, self.rolloverAt)
        return 0


То есть, если было поставлено ротирование через 7 дней, это 7 дней от старта. И оно сработает, только если программа работает 7 дней непрерывно. А если она запускается раз в час по крону и работает 10 минут, логи будут писаться вечно.

Рукиотрывать.
Делай что должно, и будь что будет
Re[2]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 26.03.10 12:22
Оценка:
Здравствуйте, netch80, Вы писали:

N> Я успел заметить (в 2.6) что внутри методов есть, например, проверка self.when=='MIDNIGHT', хотя такое значение через конструктор задать нельзя.


А, да, задать такое значение, конечно можно (там же строка, что хочешь то и задаёшь) и это даже документировано http://docs.python.org/library/logging.html#timedrotatingfilehandler

Так что явных ошибок не видно. Просто класс решает не ту задачу, которую (на мой взгляд) логично от него ждать. В документации уточнений на этот счёт тоже не видно.
Делай что должно, и будь что будет
Re[3]: [Python] Не работает TimedRotatingFileHandler
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.10 16:51
Оценка:
Здравствуйте, SergH, Вы писали:

SH>То есть, если было поставлено ротирование через 7 дней, это 7 дней от старта. И оно сработает, только если программа работает 7 дней непрерывно. А если она запускается раз в час по крону и работает 10 минут, логи будут писаться вечно.


То-то я ошибку не могу найти — такой метод и представить себе не мог в данном случае.

SH>Рукиотрывать.


Ну зачем же. /usr/sbin/logrotate ваш друг и товарищ.
The God is real, unless declared integer.
Re[4]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 26.03.10 20:47
Оценка:
Здравствуйте, netch80, Вы писали:

N>То-то я ошибку не могу найти — такой метод и представить себе не мог в данном случае.


Извини, я сегодня не догоняю, ты какой вариант не мог представить: их или мой?

N>Ну зачем же. /usr/sbin/logrotate ваш друг и товарищ.


Действительно, нахрена нам враги, когда у нас есть такие друзья (с). Тут есть два момента. Во-первых, я не понял, как он себя поведёт если в момент его запуска лог случайно открыт мной на запись. Во-вторых, мучительно не хочется делать никаких лишних глобальных настроек. Достаточно того, что приложение прописано в кроне и хватит с него. Чем меньше требуется от админов, тем лучше, работы у них и без меня хватает. Тем более, что эти логи никому кроме меня не нужны, да и мне только если что-то вдруг перестаёт работать.

Вообще, конечно, в данном случае мне бы хватило возможности добавить в стартовый скрипт что-нибудь простое, что следило бы за логами при запуске. Некоторая проблема в том, что в посиксах не хранится время создания файла, но чёрт с ним, я согласен на день недели. А если не париться совместимостью, то в FreeBSD и время создания есть.
Делай что должно, и будь что будет
Re[5]: [Python] Не работает TimedRotatingFileHandler
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 26.03.10 22:05
Оценка: 18 (1)
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, netch80, Вы писали:


N>>То-то я ошибку не могу найти — такой метод и представить себе не мог в данном случае.


SH>Извини, я сегодня не догоняю, ты какой вариант не мог представить: их или мой?


Твой — в комбинации с желанием получить ротейт от него.
Просто периодическая запись — это как раз нормально.

N>>Ну зачем же. /usr/sbin/logrotate ваш друг и товарищ.


SH>Действительно, нахрена нам враги, когда у нас есть такие друзья (с). Тут есть два момента. Во-первых, я не понял, как он себя поведёт если в момент его запуска лог случайно открыт мной на запись.


Этот же открытый файл поменяет имя и возникнет другой. Новое открытие будет уже на новое место.

SH> Во-вторых, мучительно не хочется делать никаких лишних глобальных настроек. Достаточно того, что приложение прописано в кроне и хватит с него.


Это ещё одна такая же запись в кроне. Глобальных настроек не нужно.

SH>Вообще, конечно, в данном случае мне бы хватило возможности добавить в стартовый скрипт что-нибудь простое, что следило бы за логами при запуске. Некоторая проблема в том, что в посиксах не хранится время создания файла, но чёрт с ним, я согласен на день недели. А если не париться совместимостью, то в FreeBSD и время создания есть.


Можно самому создавать имя файла для записи, а при старте делать что-то вроде
find /путь/шаблон.* -mtime +7 -delete

Время создания файла не обязательно — достаточно времени последней модификации. Просто так что-то дописывать в файл лога вряд ли кто-то будет.
The God is real, unless declared integer.
Re[6]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 26.03.10 22:35
Оценка:
Здравствуйте, netch80, Вы писали:

N>Этот же открытый файл поменяет имя и возникнет другой. Новое открытие будет уже на новое место.


Ага, дошло, изменения сработают после завершения программы со старта новой сессии.

N>Это ещё одна такая же запись в кроне. Глобальных настроек не нужно.


Крон это достаточно глобально. У меня нет прав на редактирование конфига для крона на продакшн машинах, у меня на них вообще права на запись есть только в /var/tmp. Так что заниматься и поддерживать это будут админы.

Но вообще этот вопрос надо провентилировать. Может админы будут за. Спасибо за идею.

N>Можно самому создавать имя файла для записи, а при старте делать что-то вроде

N>find /путь/шаблон.* -mtime +7 -delete

Этого мало, хочется иметь историю за пару недель. А то ведь сломается всё как нибудь, а логи то все и почищены, последняя "ротация" была вчера.

N>Время создания файла не обязательно — достаточно времени последней модификации. Просто так что-то дописывать в файл лога вряд ли кто-то будет.


Ээ, гм, время последней модификации у него постоянно меняется. Оно подходит чтобы сделать ротацию раз в неделю, типа, если последний раз меняли в воскресенье (до часа Ч), а сейчас как раз понедельник (после часа Ч), то пора всё переименовывать. А вот сделать таким образом 7 дней от даты создания не совсем понятно как.
Делай что должно, и будь что будет
Re[7]: [Python] Не работает TimedRotatingFileHandler
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 27.03.10 06:54
Оценка:
Здравствуйте, SergH, Вы писали:

N>>Можно самому создавать имя файла для записи, а при старте делать что-то вроде

N>>find /путь/шаблон.* -mtime +7 -delete
SH>Этого мало, хочется иметь историю за пару недель. А то ведь сломается всё как нибудь, а логи то все и почищены, последняя "ротация" была вчера.

s/7/14/, делов-то.

N>>Время создания файла не обязательно — достаточно времени последней модификации. Просто так что-то дописывать в файл лога вряд ли кто-то будет.


SH>Ээ, гм, время последней модификации у него постоянно меняется.


У текущего лога или предыдущих копий? Чтобы оно менялось у предыдущих, надо оочень постараться сделать криво.

SH> Оно подходит чтобы сделать ротацию раз в неделю, типа, если последний раз меняли в воскресенье (до часа Ч), а сейчас как раз понедельник (после часа Ч), то пора всё переименовывать. А вот сделать таким образом 7 дней от даты создания не совсем понятно как.


Я имел в виду не переименовывать, а сделать где-то так:

#!/bin/sh
LOGBASE=$HOME/log/foo.log
find ${LOGBASE}.* -type f -mtime +14 -delete
$HOME/bin/foo 2>>$LOGBASE.`date +%Y-%m-%d`
The God is real, unless declared integer.
Re[8]: [Python] Не работает TimedRotatingFileHandler
От: SergH Россия  
Дата: 28.03.10 01:14
Оценка:
Здравствуйте, netch80, Вы писали:

N>У текущего лога или предыдущих копий? Чтобы оно менялось у предыдущих, надо оочень постараться сделать криво.


Ну я имел ввиду, когда текущий делать предыдущим. Твой вариант понятен -- ровно в полночь карета превратится в тыкву. А потом слишком старые тыквы почистят.

Да, так тоже можно.

Можно ещё, например, считать, сколько дней прошло с нового года, делить на 10, и нумеровать файл, получится один файл в 10 дней, а не файл в день. Ну, конечно, хочется сразу всё и без хлеба, т.е. без лишнего кода и файлов.
Делай что должно, и будь что будет
Re: [Python] Не работает TimedRotatingFileHandler
От: kwas Россия  
Дата: 03.04.10 08:24
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Привет!


SH>Должен по идее раз в 10 секунд создавать новый лог. Не получается. Ни под виндой, ни под FreeBSD. Вариант с установкой ротации на день недели тоже не работают.

SH>Но хочется всё же по времени. Может я что-то делаю неправильно?

Посмотрите дифф здесь. Мы пока сделали наследника TimedRotatingFileHandler, который делает то, что в диффе.
If a shark stops swimming, it will die. Don't stop swimming, Mr. Mulder.
Every epic equalizer is iso (c)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.