关于python:timedrotatingfilehandler更改文件名?

TimedRotatingFileHandler Changing File Name?

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

当它滚动到午夜时,它以"YYYY-MM-DD"的形式追加当前日期。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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\
otate_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,发现几乎什么都没有。


"如何更改文件名?"

因为它没有文档,所以我选择阅读源代码。这是我在阅读logging/handlers.py的来源时得出的结论。

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

后缀是格式字符串。


您可以按照上面的建议更改日志后缀,但也需要更改extmatch变量以匹配后缀,以便找到旋转的文件:

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


有另一种方法来解决这个问题:例如,我需要每天旋转日志,但是必须用后缀命名,后缀格式为%m%d%y…

所以我写了一个timedrotatingfilehandler remix!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
2
3
4
if(current_time > old_time):
    for each in logging.getLogger('Debug').handlers:
      each.stream = open("C:\
ewOutput"
, 'a')

这就是重点。它花了很多时间戳和环顾四周,但修改流是最简单的方法。

:)


谢谢。

我看了来源。

真的没有办法改变它的形式。因为操作后缀,所以只附加到文件名的末尾。另一方面,没有真正的方法来操作完整的文件名,我希望的是在哪里可以声明一个文件掩码,当它执行"滚动"时,它将根据文件掩码创建一个新的文件名。我要回到我最初的想法,就是杀死整个日志子系统,当它rollsover时用新的文件名重新初始化它。

谢谢。