我正在尝试实现名为TimedRotatingFileHandler的python日志记录处理程序。
当它翻到午夜时,它会以“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是当前日期。
如何更改文件名的更改方式?我用Google搜索并查看了API,几乎找不到任何内容。
答案 0 :(得分:34)
“我怎样才能改变它改变文件名的方式?”
由于没有记录,我选择阅读来源。这是我从阅读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)
后缀是格式化字符串。
答案 1 :(得分: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
答案 2 :(得分:1)
感谢。
我查看了来源。
没有办法改变它的形式。由于操作后缀,只附加到文件名的末尾。以太方式,没有办法真正操作完整的文件名,我希望的是你可以声明文件掩码的地方,当它执行“RollOver”时它会根据文件掩码创建一个新的文件名。我将回到我最初的想法,就是杀掉整个日志记录子系统,并在RollsOver时使用新文件名重新初始化它。
谢谢你。
答案 3 :(得分:1)
只是更新,我最终采用了不同的方法。
我发现修改文件输出的最简单方法是简单地使用FileHandler,然后是时候进行翻转了。
我这样做:
if(current_time > old_time):
for each in logging.getLogger('Debug').handlers:
each.stream = open("C:\\NewOutput", 'a')
这就是它的要点。它花了很多时间来寻找并环顾四周,但修改流是最简单的方法。
:)
答案 4 :(得分:1)
在 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)