簡體   English   中英

TimedRotatingFileHandler 更改文件名?

[英]TimedRotatingFileHandler Changing File Name?

我正在嘗試實現 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是當天。

我怎樣才能改變它改變文件名的方式?

“我怎樣才能改變它改變文件名的方式?”

由於它沒有記錄,我選擇閱讀源代碼。 這是我通過閱讀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)

后綴是格式化字符串。

您可以通過更改上面建議的日志后綴來完成此操作,但您還需要更改 extMatch 變量以匹配后綴以查找旋轉文件:

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

這個問題還有另一種方法:例如,我需要每天輪換日志,但它們必須以 %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

謝謝。

我看了一下源碼。

真的沒有辦法改變它的形式。 由於操作后綴,只附加到文件名的末尾。 以太方式,沒有真正的方法來操作完整的文件名,我希望你可以聲明一個文件掩碼,當它執行“翻轉”時,它將根據文件掩碼創建一個新的文件名. 我只是要回到我最初的想法,只是殺死整個日志子系統並在它滾動時使用新文件名重新初始化它。

謝謝你。

只是一個更新,我最終采用了不同的方法。

我發現修改文件輸出的最簡單方法是簡單地使用 FileHandler,然后什么時候進行翻轉。

我這樣做:

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

這就是它的要點。 這需要大量的探索和環顧,但修改流是最簡單的方法。

:)

在 Python 3.8 中,您可以更改提供的“self.namer”,以便在進行旋轉時可以對文件名進行任何操作。 像這樣的東西:

def my_namer(default_name):
    # This will be called when doing the log rotation
    # default_name is the default filename that would be assigned, e.g. Rotate_Test.txt.YYYY-MM-DD
    # Do any manipulations to that name here, for example this changes the name to Rotate_Test.YYYY-MM-DD.txt
    base_filename, ext, date = default_name.split(".")
    return f"{base_filename}.{date}.{ext}"

logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1)
logger.namer = my_namer
root_logger.addHandler(logger)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM