2008-12-03 140 views
6

我想實現名爲TimedRotatingFileHandler的python日誌處理程序。TimedRotatingFileHandler更改文件名?

當它翻到午夜時,它會以「YYYY-MM-DD」的形式附加當天。

LOGGING_MSG_FORMAT = '%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s' 
LOGGING_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' 

logging.basicConfig(
      level=logging.DEBUG, 
      format=LOGGING_MSG_FORMAT, 
      datefmt=LOGGING_DATE_FORMAT 
      ) 
root_logger = logging.getLogger('') 
logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1) 
root_logger.addHandler(logger) 
while True: 
    daemon_logger = logging.getLogger('TEST') 
    daemon_logger.info("SDFKLDSKLFFJKLSDD") 
    time.sleep(60) 

創建被稱爲僅僅是「Rotate_Test」那麼,一旦翻轉到第二天它改變了文件名的第一個日誌文件:「Rotate_Test.YYYY-MM-DD」,其中YYYY-MM-DD是當天。

我該如何改變它如何改變文件名?我搜索了一下,看了看API,幾乎找不到任何東西。

回答

23

「我怎樣才能改變它如何改變文件名?」

由於沒有記錄,我選擇閱讀來源。這是我從閱讀的logging/handlers.py

handler = logging.handlers.TimedRotatingFileHandler("C:\\isis_ops\\logs\\Rotate_Test",'midnight',1) 
handler.suffix = "%Y-%m-%d" # or anything else that strftime will allow 
root_logger.addHandler(handler) 

源的後綴是格式化字符串結束。

+0

這是非常有用的, 謝謝! – Nobilis 2015-09-24 09:13:42

1

謝謝。

我看了看源代碼。

沒有真正的方法來改變它的形式。由於操作後綴,只能追加到文件名的末尾。以太的方式,沒有辦法真正的方式來操縱完整的文件名,我所希望的是你可以在哪裏聲明一個文件掩碼,當它執行「RollOver」時,它將根據文件掩碼創建一個新的文件名。我只想回到我最初的想法,就是殺死整個日誌子系統,並在RollsOver時用新文件名重新初始化它。

謝謝。

+1

爲什麼不寫你自己的處理程序?這似乎很簡單。你不必使用他們的處理程序。一個處理程序的API非常簡單(我認爲它是`emit`方法。 – 2008-12-03 21:49:21

1

只是一個更新,我結束了去一個不同的方法。

我發現修改文件輸出最簡單的方法就是簡單地使用FileHandler,然後當它是時間翻轉。

我這樣做:

if(current_time > old_time): 
    for each in logging.getLogger('Debug').handlers: 
     each.stream = open("C:\\NewOutput", 'a') 

那是它的要點。它需要大量的戳和四處看看,但修改流是最簡單的方法。

:)

2

還有一個辦法解決這個問題:比如,我需要每天都在旋轉,日誌,但它們必須在%M%d%Y格式的後綴命名...

所以我寫了一個TimedRotatingFileHandler混音!

try: 
    import codecs 
except ImportError: 
    codecs = None 
import logging.handlers 
import time 
import os 

class MyTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler): 
    def __init__(self,dir_log): 
    self.dir_log = dir_log 
    filename = self.dir_log+time.strftime("%m%d%Y")+".txt" #dir_log here MUST be with os.sep on the end 
    logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when='midnight', interval=1, backupCount=0, encoding=None) 
    def doRollover(self): 
    """ 
    TimedRotatingFileHandler remix - rotates logs on daily basis, and filename of current logfile is time.strftime("%m%d%Y")+".txt" always 
    """ 
    self.stream.close() 
    # get the time that this sequence started at and make it a TimeTuple 
    t = self.rolloverAt - self.interval 
    timeTuple = time.localtime(t) 
    self.baseFilename = self.dir_log+time.strftime("%m%d%Y")+".txt" 
    if self.encoding: 
    self.stream = codecs.open(self.baseFilename, 'w', self.encoding) 
    else: 
    self.stream = open(self.baseFilename, 'w') 
    self.rolloverAt = self.rolloverAt + self.interval 
1

您可以通過更改日誌後綴上面所建議這樣做,但你也將需要更改extMatch變量相匹配的後綴爲它找到輪換文件:

handler.suffix = "%Y%m%d" 
handler.extMatch = re.compile(r"^\d{8}$")