TimedRotatingFileHandler更改文件名?

Ube*_*per 15 python logging

我正在尝试实现名为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)
Run Code Online (Sandbox Code Playgroud)

创建的第一个日志文件仅称为"Rotate_Test",然后一旦翻转到第二天,它将文件名更改为:"Rotate_Test.YYYY-MM-DD"其中YYYY-MM-DD是当前日期.

我怎样才能改变它改变文件名的方式?我用Google搜索并查看了API,几乎找不到任何东西.

S.L*_*ott 36

"我怎样才能改变它改变文件名的方式?"

由于没有记录,我选择阅读来源.这是我从阅读的源头得出的结论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)
Run Code Online (Sandbox Code Playgroud)

后缀是格式化字符串.

  • 那非常有用,谢谢! (2认同)

小智 8

在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)
Run Code Online (Sandbox Code Playgroud)


Tim*_*mah 5

您可以通过更改上面建议的日志后缀来做到这一点,但您还需要更改 extMatch 变量以匹配后缀以查找旋转文件:

handler.suffix = "%Y%m%d"
handler.extMatch = re.compile(r"^\d{8}$")
Run Code Online (Sandbox Code Playgroud)