2008-12-03 144 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}$")