2010-08-16 45 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= 

在我的代碼設置和使用這樣的記錄:

import logging 
import logging.config 

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

消息記錄到我指定的(driver.log)的文件,但午夜旋轉永遠不會發生。

這個過程是否必須在午夜時間運行才能發生旋轉?這是一個批處理過程,我每15分鐘運行一次,並且從未在午夜實際運行。

回答

2

我想這隻會發生在進程在午夜運行時。在你的情況下(cronjob運行時間不長),你應該使用一個簡單的日誌文件,將當前日期添加到日誌文件名中。這樣,「翻轉」就會自動發生。

+1

是的,我試圖不重新發明輪子,因爲我也需要這些文件在一段時間後回收。 – cope360 2010-08-16 21:10:12

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 

我在初始化記錄器之前調用此函數來旋轉我的日誌。