Должен по идее раз в 10 секунд создавать новый лог. Не получается. Ни под виндой, ни под FreeBSD. Вариант с установкой ротации на день недели тоже не работают.
SH>Никак не работает. Например, такой код:
SH>Но хочется всё же по времени. Может я что-то делаю неправильно?
Вы играете в <del>бога</del>админа.
Просто пишите в /dev/log или удалённый сислог с помощью SyslogHandler, а там уже разберутся (или вы разберётесь) в какие файлы это складывать и как часто ротировать.
Re[2]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, Temoto, Вы писали:
T>Вы играете в <del>бога</del>админа.
Это делается так
T>Просто пишите в /dev/log или удалённый сислог с помощью SyslogHandler, а там уже разберутся (или вы разберётесь) в какие файлы это складывать и как часто ротировать.
Если кратко, то религия не позволяет.
Расписывать ситуацию лень, буду рад услышать ответы по теме вопроса.
Вообще-то исходный код модуля лежит открыто, можно просто почитать. Я успел заметить (в 2.6) что внутри методов есть, например, проверка self.when=='MIDNIGHT', хотя такое значение через конструктор задать нельзя. Возможно, этот модуль настолько редко используется, что никто не нарывался на ошибку?
The God is real, unless declared integer.
Re[2]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, 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
Здравствуйте, netch80, Вы писали:
N> Я успел заметить (в 2.6) что внутри методов есть, например, проверка self.when=='MIDNIGHT', хотя такое значение через конструктор задать нельзя.
Так что явных ошибок не видно. Просто класс решает не ту задачу, которую (на мой взгляд) логично от него ждать. В документации уточнений на этот счёт тоже не видно.
Делай что должно, и будь что будет
Re[3]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, SergH, Вы писали:
SH>То есть, если было поставлено ротирование через 7 дней, это 7 дней от старта. И оно сработает, только если программа работает 7 дней непрерывно. А если она запускается раз в час по крону и работает 10 минут, логи будут писаться вечно.
То-то я ошибку не могу найти — такой метод и представить себе не мог в данном случае.
SH>Рукиотрывать.
Ну зачем же. /usr/sbin/logrotate ваш друг и товарищ.
The God is real, unless declared integer.
Re[4]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, netch80, Вы писали:
N>То-то я ошибку не могу найти — такой метод и представить себе не мог в данном случае.
Извини, я сегодня не догоняю, ты какой вариант не мог представить: их или мой?
N>Ну зачем же. /usr/sbin/logrotate ваш друг и товарищ.
Действительно, нахрена нам враги, когда у нас есть такие друзья (с). Тут есть два момента. Во-первых, я не понял, как он себя поведёт если в момент его запуска лог случайно открыт мной на запись. Во-вторых, мучительно не хочется делать никаких лишних глобальных настроек. Достаточно того, что приложение прописано в кроне и хватит с него. Чем меньше требуется от админов, тем лучше, работы у них и без меня хватает. Тем более, что эти логи никому кроме меня не нужны, да и мне только если что-то вдруг перестаёт работать.
Вообще, конечно, в данном случае мне бы хватило возможности добавить в стартовый скрипт что-нибудь простое, что следило бы за логами при запуске. Некоторая проблема в том, что в посиксах не хранится время создания файла, но чёрт с ним, я согласен на день недели. А если не париться совместимостью, то в FreeBSD и время создания есть.
Делай что должно, и будь что будет
Re[5]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, 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
Здравствуйте, netch80, Вы писали:
N>Этот же открытый файл поменяет имя и возникнет другой. Новое открытие будет уже на новое место.
Ага, дошло, изменения сработают после завершения программы со старта новой сессии.
N>Это ещё одна такая же запись в кроне. Глобальных настроек не нужно.
Крон это достаточно глобально. У меня нет прав на редактирование конфига для крона на продакшн машинах, у меня на них вообще права на запись есть только в /var/tmp. Так что заниматься и поддерживать это будут админы.
Но вообще этот вопрос надо провентилировать. Может админы будут за. Спасибо за идею.
N>Можно самому создавать имя файла для записи, а при старте делать что-то вроде N>find /путь/шаблон.* -mtime +7 -delete
Этого мало, хочется иметь историю за пару недель. А то ведь сломается всё как нибудь, а логи то все и почищены, последняя "ротация" была вчера.
N>Время создания файла не обязательно — достаточно времени последней модификации. Просто так что-то дописывать в файл лога вряд ли кто-то будет.
Ээ, гм, время последней модификации у него постоянно меняется. Оно подходит чтобы сделать ротацию раз в неделю, типа, если последний раз меняли в воскресенье (до часа Ч), а сейчас как раз понедельник (после часа Ч), то пора всё переименовывать. А вот сделать таким образом 7 дней от даты создания не совсем понятно как.
Делай что должно, и будь что будет
Re[7]: [Python] Не работает TimedRotatingFileHandler
Здравствуйте, SergH, Вы писали:
N>>Можно самому создавать имя файла для записи, а при старте делать что-то вроде N>>find /путь/шаблон.* -mtime +7 -delete SH>Этого мало, хочется иметь историю за пару недель. А то ведь сломается всё как нибудь, а логи то все и почищены, последняя "ротация" была вчера.
s/7/14/, делов-то.
N>>Время создания файла не обязательно — достаточно времени последней модификации. Просто так что-то дописывать в файл лога вряд ли кто-то будет.
SH>Ээ, гм, время последней модификации у него постоянно меняется.
У текущего лога или предыдущих копий? Чтобы оно менялось у предыдущих, надо оочень постараться сделать криво.
SH> Оно подходит чтобы сделать ротацию раз в неделю, типа, если последний раз меняли в воскресенье (до часа Ч), а сейчас как раз понедельник (после часа Ч), то пора всё переименовывать. А вот сделать таким образом 7 дней от даты создания не совсем понятно как.
Я имел в виду не переименовывать, а сделать где-то так:
Здравствуйте, netch80, Вы писали:
N>У текущего лога или предыдущих копий? Чтобы оно менялось у предыдущих, надо оочень постараться сделать криво.
Ну я имел ввиду, когда текущий делать предыдущим. Твой вариант понятен -- ровно в полночь карета превратится в тыкву. А потом слишком старые тыквы почистят.
Да, так тоже можно.
Можно ещё, например, считать, сколько дней прошло с нового года, делить на 10, и нумеровать файл, получится один файл в 10 дней, а не файл в день. Ну, конечно, хочется сразу всё и без хлеба, т.е. без лишнего кода и файлов.
Здравствуйте, 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)