【问题标题】:Python logging and dynamic logfile namePython 日志记录和动态日志文件名
【发布时间】:2021-11-16 09:24:59
【问题描述】:

我正在尝试使用日志模块在 python3 中每天创建一个日志。
我知道 TimedRotatingFileHandler 模块,但它不能按我的需要工作,它将数据存储在一个固定名称的文件中,并根据后缀重命名它。
我需要根据日期为每条消息定义日志文件名。
我实施的不起作用。使用正确的名称创建日志文件,但第二天,新的文件没有创建,日志仍然写入旧文件。
这是我的工作:

import logging ,coloredlogs,platform
import sys,os
from datetime import datetime
FORMATTER = logging.Formatter("%(asctime)s : %(hostname)s : %(name)s : %(levelname)s : %(message)s")
LOG_FILE = os.environ['RMQ_DISPACHER_LOGFILE']
NICKNAME = os.environ['LOGNICKNAME']

class HostnameFilter(logging.Filter):
    hostname = platform.node()
    def filter(self, record):
        record.hostname = HostnameFilter.hostname
        return True

def get_console_handler():
    console_handler = logging.StreamHandler(sys.stdout)
    console_handler.addFilter(HostnameFilter())
    console_handler.setFormatter(FORMATTER)
    return console_handler

def get_file_handler():
    file_handler = logging.FileHandler( "%s/%s_%s.log" % (LOG_FILE,NICKNAME,datetime.now().strftime('%Y%m%d')) )
    file_handler.addFilter(HostnameFilter())
    file_handler.setFormatter(FORMATTER)
    return file_handler

def get_logger(logger_name):
    logger = logging.getLogger(logger_name)
    logger.setLevel(logging.DEBUG)
    logger.addHandler(get_console_handler())
    logger.addHandler(get_file_handler())
    logger.propagate = False
    coloredlogs.install(logger=logger)
    return logger

我想知道是否可以使用日志记录模块登录到"%s/%s_%s.log" % (LOG_FILE,NICKNAME,datetime.now().strftime('%Y%m%d'))

谢谢。

【问题讨论】:

    标签: python logging


    【解决方案1】:

    你必须使用TimedRotatingFileHandler,并设置when参数。

    tools/log.py 模块摘录:

    import datetime, logging, platform
    import logging.handlers
    
    # set default rootdir for logs and the splitter win/linux, 
    rootdir = None
    splitter = None
    if platform.os=='Windows':
        splitter = "\\"
        rootdir = "C:\\SharedArea\\reports"
    else:
        rootdir = "/tmp"
        splitter = "/"
    
    # add rotating filehandler when we need it
    def add_rotating_handler(loggername:str, rootdir:str=rootdir, name:str="test.log", format="%Y%m%d%H%M", level:int=logging.DEBUG, when:str=None):
        """ add a timed rotating filehandler """
        if not when:
            when = 'D'
        fh = logging.handlers.TimedRotatingFileHandler(rootdir + splitter + name,  when=when)
        fh.suffix = format
        fh.setLevel(level)
        fh.setFormatter(logging.Formatter(file_fmt, datefmt))
        logging.getLogger(loggername).addHandler(fh)
    

    测试程序:

    #!/usr/bin/env python3
    import datetime, logging, os, time, tools.log
    
    logname = 'root.tools.' + os.path.basename(__file__).split(',')[0]
    tools.log.add_rotating_handler(logname, rootdir="c:\\temp\\", format="%Y%m%d%H%M", name="NICKNAME", when='M')
    log = logging.getLogger(logname)
    try:
        while True:
            log.info(f"time is now:{datetime.datetime.now()}")
            time.sleep(10)
    except KeyboardInterrupt as e:
        pass
    

    在温度:

    PS C:\temp> ls  
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    -a----        11/16/2021   4:43 PM            522 NICKNAME.202111161642
    -a----        11/16/2021   4:44 PM            522 NICKNAME.202111161643
    -a----        11/16/2021   4:45 PM            522 NICKNAME.202111161644
    -a----        11/16/2021   4:46 PM            522 NICKNAME.202111161645
    

    【讨论】:

    • 感谢您的回复,我尝试使用 datefmt = "%Y%m%d%M" 但不幸的是没有创建新的文件名。如果我找到解决方案,我会在这里解释。再次感谢。
    • @Eric,很抱歉这个仓促的例子,更新了一个有效的例子。
    • 谢谢,但正如我在帖子中所说的那样 TimedRotatingFileHandler 对我来说不是一个解决方案,因为它不是动态的。它只是将文件复制到带时间戳的文件中。不过感谢您的帮助。
    • 我已经尝试了另一种方法,但仍然没有成功:logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) logger.addHandler(get_console_handler()) for hdlr in logger .handlers[:]: if isinstance(hdlr,logging.FileHandler): logger.removeHandler(hdlr) logger.addHandler(get_file_handler())
    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2014-10-21
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多