2010-08-16 2 views
6

Это мой конфигурационный файл:Почему мой TimedRotatingFileHandler не поворачивается в полночь?

[loggers] 
keys=root 

[handlers] 
keys=TimedRotatingFileHandler 

[formatters] 
keys=simpleFormatter 

[logger_root] 
level=DEBUG 
handlers=TimedRotatingFileHandler 

[handler_TimedRotatingFileHandler] 
class=handlers.TimedRotatingFileHandler 
level=DEBUG 
formatter=simpleFormatter 
args=('driver.log', 'midnight', 1, 30) 

[formatter_simpleFormatter] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 
datefmt= 

В моем коде установки I и использовать регистратор как это:

import logging 
import logging.config 

logging.config.fileConfig('logging.conf') 
logging.info('Some message...') 

сообщения записываются в файл указываю (driver.log), но вращений в полночь никогда не бывает.

Должен ли процесс работать в полночь для поворота? Это пакетный процесс, который я запускаю каждые 15 минут, и он никогда не работает в полночь.

ответ

16

Ответ заключается в том, что процесс должен работать постоянно, чтобы это работало должным образом.

От http://bytes.com/topic/python/answers/595931-timedrotatingfilehandler-isnt-rotating-midnight:

Вращения должны произойти, когда процесс каротажа создает обработчик до полуночи и делает протоколирование вызова, предназначенный для этого обработчика после полуночи.

+2

+1 звучит как проблема. –

2

Я бы предположил, что это действительно происходит, только когда процесс запущен в полночь. В вашем случае (cronjob не работает очень долго), вы должны пойти с простым файлом журнала, где текущая дата добавляется в logfilename. Таким образом, «опрокидывание» происходит автоматически.

+1

Да, я пытался не изобретать велосипед, так как мне также нужны эти файлы для утилизации через некоторое время. – cope360

0

Я также столкнулся с этой проблемой, по разным причинам я не мог использовать rotatelog и cron, чтобы вращать журналы, просто добавляя дополнительную вещь, которая может пойти не так. Я использовал функцию ниже для ежедневного вращения файлов.

import os 
import datetime 
import glob 

def sort_number_ext(s): 
    try: 
     return int(os.path.splitext(s)[1][1:]) 
    except: 
     return s 

def rotate_file(file, keep=30): 
    """ Rotate a file if needed. If the file wasn't modified today then we 
    rotate it around and remove old files """ 

    modified_date = datetime.datetime.fromtimestamp(os.path.getmtime(file)) 

    if modified_date.date() == datetime.datetime.today().date(): 
     return False 

    old_files = glob.glob(file + ".*") 
    old_files.sort(key=sort_number_ext, reverse=True) 

    for f in old_files: 
     try: 
      number = int(os.path.splitext(f)[1][1:]) 
     except ValueError: 
      continue 

     if number >= keep: 
      # If at or above keep limit, remove. 
      os.unlink(f) 
     else: 
      # Increment. 
      new = "%s.%s" % (os.path.splitext(f)[0], number + 1) 
      os.rename(f, new) 

    # Finally rename our log. 
    os.rename(file, "%s.1" % file) 
    return True 

Я вызываю это, чтобы повернуть мои журналы перед инициализацией регистратора.

Смежные вопросы