如何使用python日志模块为日志文件指定文件名?

如何使用python日志模块为日志文件指定文件名?,python,date,logging,Python,Date,Logging,我试图使用python模块每小时创建一个新的日志文件,但它似乎不起作用 有时它只创建mylog,有时它包含文件名的日期mylog.YYYYMMDD 我只希望它是mylog.YYYYMMDD。错误在哪里 我的代码: logging.basicConfig( level=logging.INFO ) root_logger = logging.getLogger('') handler = logging.handlers.TimedRotatingFileHandler("mylog",whe

我试图使用python模块每小时创建一个新的日志文件,但它似乎不起作用

有时它只创建mylog,有时它包含文件名的日期mylog.YYYYMMDD

我只希望它是mylog.YYYYMMDD。错误在哪里

我的代码:

logging.basicConfig(
level=logging.INFO

)

root_logger = logging.getLogger('')
handler = logging.handlers.TimedRotatingFileHandler("mylog",when='midnight',interval=1,backupCount=10)
handler.suffix = "%Y-%m-%d"
root_logger.addHandler(handler)

在日志会话开始时,只调用一次
logging.handlers.TimedRotatingFileHandler(“mylog”,时间为'midnight',间隔为1,备份计数为10)

如果每次调用上述行,将创建TimedRotatingFileHandler类的新实例,并将创建一个新的日志流。这将生成“mylog”,而不带时间戳,因为日志将按照Python文档中的描述重置:

下面是一个简单的示例,展示了我在上面所描述的内容:

def create_timed_rotating_log(path):
    """"""
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)

    handler = TimedRotatingFileHandler(path,
                                   when="m",
                                   interval=1,
                                   backupCount=5)
    logger.addHandler(handler)

    for i in range(6):
        logger.info("This is a test!")
        time.sleep(75)

在日志会话开始时,只调用一次
logging.handlers.TimedRotatingFileHandler(“mylog”,时间为'midnight',间隔为1,备份计数为10)

如果每次调用上述行,将创建TimedRotatingFileHandler类的新实例,并将创建一个新的日志流。这将生成“mylog”,而不带时间戳,因为日志将按照Python文档中的描述重置:

下面是一个简单的示例,展示了我在上面所描述的内容:

def create_timed_rotating_log(path):
    """"""
    logger = logging.getLogger("Rotating Log")
    logger.setLevel(logging.INFO)

    handler = TimedRotatingFileHandler(path,
                                   when="m",
                                   interval=1,
                                   backupCount=5)
    logger.addHandler(handler)

    for i in range(6):
        logger.info("This is a test!")
        time.sleep(75)

首先,请注意:调整
RotatingFileHandler
.suffix
字段通常是不明智的,因为实际上有两个字段依赖于日志文件名后缀。一个是表示为
strftime
format指令的文字后缀,另一个是用于选择要删除的旧日志文件的正则表达式。如果设置了一个而没有设置另一个,则可能会使代码无法删除文件(这是最有可能的),或删除错误的文件(可能性要小得多)。幸运的是,您设置的
.suffix
.suffix
已经在使用
when='midnight'
时设置的

接下来,这些旋转文件处理程序的设计不是您所期望的。相反,这里有一个当前文件的概念,然后是一些保存的备份文件。当前文件没有后缀:它只是名为
mylog
。情况总是这样

每隔一段时间,在旋转间隔和时间,或者在它过去之后的某个时间,如果您记录的频率不够高,日志模块会注意到,哦,看看时间/日期/无论什么,是时候创建一个新的
mylog
文件了。在这一点上,它:

  • 将现有的
    mylog
    文件(如果有)重命名为备份名称,使用它根据
    when
    参数选择的后缀
  • 创建一个新的
    mylog
    (未固定)文件;及
  • 如果现在存在“太多”备份文件,则删除任何额外的备份文件
换句话说,在午夜或之后的某个时候,这是你选择的“时间”;只有在记录一条消息时,事件的实际顺序才会发生。您现有的处理程序会注意到现在是创建新文件的时候了。它查找后缀部分匹配的
mylog.
文件名:

r"^\d{4}-\d{2}-\d{2}$"
(这是针对
午夜
的硬编码;当值时,还有其他针对其他
的硬编码正则表达式)。如果现在此类文件的备份数量小于
备份数量
(10),则现有的文件将保持不变。否则,将删除这些文件中足够多的最旧文件1,以便只剩下9个。现有的
mylog
随后成为
mylog.2017-03-13
或类似文件(取决于课程日期),并打开一个没有后缀的新
mylog
,作为当前日志文件

如果您获得的文件名为
mylog.2017-03-13 13:00
(包括空格、小时和分钟),则表明您对
.suffix
字段的处理方式在示例代码中未显示。精确到一分钟的格式(对于
when=='m'
when=='m'
)是:

它有下划线和连字符,而不是空格和冒号,至少在我看到的源代码中是这样

您可能还需要了解一些一般的日志记录背景



1“最旧”取决于字符串排序顺序,这要求文件名按字母顺序排序,与按数字排序的方式相同。因此后缀必须先是年,然后是月,然后是天,然后是小时,依此类推:使用月份名称,如
Jan
Feb
Apr
将导致
Apr
出现在-code>Feb
之前,即早于
Jan
,等等,注意:调整
RotatingFileHandler
.suffix
字段通常是不明智的,因为实际上有两个字段依赖于日志文件名后缀。一个是表示为
strftime
format指令的文字后缀,另一个是用于选择要删除的旧日志文件的正则表达式。如果设置了一个而没有设置另一个,则可能会使代码无法删除文件(这是最有可能的),或删除错误的文件(可能性要小得多)。幸运的是,您设置的
.suffix
.suffix
已经在使用
when='midnight'
时设置的

接下来,这些旋转文件处理程序的设计不是您所期望的。相反,这里有一个当前文件的概念,然后是一些保存的备份文件。当前文件没有后缀:它只是名为
mylog
。情况总是这样

每隔一段时间,在旋转间隔和时间,或者在它过去之后的某个时间,如果您记录的频率不够高,日志模块会注意到,哦,看看时间/日期/无论什么,是时候创建一个新的
mylog
文件了。在这一点上,它:

  • 使用后缀将现有的
    mylog
    文件(如果有)重命名为备份名称