【问题标题】:TimedRotatingFileHandler Changing File Name?TimedRotatingFileHandler 更改文件名?
【发布时间】:2008-12-03 19:37:51
【问题描述】:

我正在尝试实现 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 是当天。

如何更改文件名的更改方式?

【问题讨论】:

    标签: python logging


    【解决方案1】:

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

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

    后缀为格式化字符串。

    【讨论】:

      【解决方案2】:

      您可以按照上面的建议通过更改日志后缀来做到这一点,但您还需要更改 extMatch 变量以匹配后缀,以便它找到旋转的文件:

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

      【讨论】:

        【解决方案3】:

        这个问题还有另一种方法:例如,我需要每天轮换日志,但它们必须使用 %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
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            谢谢。

            我查看了源代码。

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

            谢谢你。

            【讨论】:

            • 为什么不编写自己的处理程序?这似乎很简单。您不必使用他们的处理程序。处理程序的 API 非常简单(我认为是 emit 方法。
            【解决方案6】:

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

            我发现修改文件输出的最简单方法是简单地使用 FileHandler,然后在需要翻转时使用。

            我这样做:

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

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

            :)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-08-05
              • 2019-09-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多