TimedRotatingFileHandler更改文件名?

时间:2008-12-03 19:37:51

标签: python logging

我正在尝试实现名为TimedRotatingFileHandler的python日志记录处理程序。

当它翻到午夜时,它会以“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是当前日期。

如何更改文件名的更改方式?我用Google搜索并查看了API,几乎找不到任何内容。

5 个答案:

答案 0 :(得分:34)

“我怎样才能改变它改变文件名的方式?”

由于没有记录,我选择阅读来源。这是我从阅读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)

后缀是格式化字符串。

答案 1 :(得分: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

答案 2 :(得分:1)

感谢。

我查看了来源。

没有办法改变它的形式。由于操作后缀,只附加到文件名的末尾。以太方式,没有办法真正操作完整的文件名,我希望的是你可以声明文件掩码的地方,当它执行“RollOver”时它会根据文件掩码创建一个新的文件名。我将回到我最初的想法,就是杀掉整个日志记录子系统,并在RollsOver时使用新文件名重新初始化它。

谢谢你。

答案 3 :(得分:1)

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

我发现修改文件输出的最简单方法是简单地使用FileHandler,然后是时候进行翻转了。

我这样做:

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

这就是它的要点。它花了很多时间来寻找并环顾四周,但修改流是最简单的方法。

:)

答案 4 :(得分:1)

在 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)