我设置了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
派生的新处理程序
它创建了一个新文件(例如某些索引),但却删除了现有的日志文件。
答案 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