Python TimedRotatingFileHandler覆盖日志

时间:2018-02-02 08:31:02

标签: python logging

我设置了TimedRotatingFileHandler

import logging as logging
from logging.handlers import TimedRotatingFileHandler
import os
import time

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# new file every minute
rotation_logging_handler = TimedRotatingFileHandler('logs/log', 
                               when='m', 
                               interval=1, 
                               backupCount=5)
rotation_logging_handler.setLevel(logging.DEBUG)

format = u'%(asctime)s\t%(levelname)s\t%(filename)s:%(lineno)d\t%(message)s'
rotation_logging_handler.setFormatter(logging.Formatter(format))
rotation_logging_handler.suffix = '%Y-%m-%d'

logger.addHandler(rotation_logging_handler)

用法:

logger.logging.info('Service started at port %s', config.get_param('port'))

while True:
    time.sleep(21)
    logger.logging.info('Now time is {}'.format(time.time()))

我预计来自logs/log的每一分钟新邮件都必须附加到当前日期的现有日志文件中。相反,来自logs/log的每分钟消息都覆盖了当前日期的现有日志文件。

我该怎样做才能达到这种行为?

PS:经过小规模研究后,我发现TimedRotatingFileHandler方法中的doRollover删除了现有的日志文件并创建了新文件。所以第一个解决方案是创建从TimedRotatingFileHandler派生的新处理程序  它创建了一个新文件(例如某些索引),但却删除了现有的日志文件。

3 个答案:

答案 0 :(得分:1)

经过一些研究后,我在BaseRotatingHandler.rotation_filename method中找到了RUN apt-get update \ && apt-get install -y git \ && <other command under RUN> \ && <and so on> 属性用法:

  

默认实现调用&#39; namer&#39;处理程序的属性,如果它是可调用的,则将默认名称传递给它。如果该属性不可调用(默认值为None),则返回不变的名称。

作为解决方案,我实施了自己的BaseRotatingHandler.namer函数,该函数获得了namer并使用我的模板返回了新的filename

  • filename
  • 20181231.log
  • 20181231.0.log

完整示例:

20181231.1.log

答案 1 :(得分:0)

根据TimedRotatingFileHandler的文件:

  

系统将通过附加扩展来保存旧的日志文件   文件名。扩展是基于日期和时间的,使用strftime   格式%Y-%m-%d_%H-%M-%S或其前导部分,取决于   翻转间隔。

换句话说:通过修改后缀打破了翻转。只需将其保留为默认值,python将创建名为:

的文件
  • logs/log2018-02-02-01-30
  • logs/log2018-02-02-01-31
  • logs/log2018-02-02-01-32
  • logs/log2018-02-02-01-33
  • logs/log2018-02-02-01-34

在此之后(如果backupCount=5),它将删除-30并创建-35

如果你想要这样的名字:

  • logs/log2018-02-02-01.0
  • logs/log2018-02-02-01.1
  • logs/log2018-02-02-01.2
  • logs/log2018-02-02-01.3
  • logs/log2018-02-02-01.4

0是最新的.4,{{1}}是最旧的那个,是的,该处理程序并不是为此而设计的。

答案 2 :(得分:0)

通过覆盖rotation_filename类的BaseRotatingHandler方法并将其设置为适当的可调用项,很有可能在将文件名旋转为所需文件名时将其更改。

这是执行此操作的非常简单的示例,但是您可以根据需要进行调整。

import logging
from logging.handlers import TimedRotatingFileHandler
import datetime as dt

def filer(self):
    now = dt.datetime.now()
    return 'file.txt'+now.strftime("%Y-%m-%d_%H:%M:%S")


logger = logging.getLogger()
rotating_file_handler = TimedRotatingFileHandler(filename="/Users/rbhanot/file.txt",
                                                 when='S',
                                                 interval=2,
                                                 backupCount=5)
rotating_file_handler.rotation_filename = filer
formatter = logging.Formatter(
    '%(asctime)s %(name)s:%(levelname)s - %(message)s')
rotating_file_handler.setFormatter(formatter)
logger.addHandler(rotating_file_handler)
logger.setLevel(logging.DEBUG)

logger.info("hello")

这是

的输出
❯ ls file*
file.txt  file.txt2020-10-06_13:12:13  file.txt2020-10-06_13:12:15  file.txt2020-10-06_13:13:45