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

时间:2017-03-13 07:24:48

标签: python date logging

我正在尝试使用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)

2 个答案:

答案 0 :(得分:2)

在记录会话开始时只调用logging.handlers.TimedRotatingFileHandler("mylog",when='midnight',interval=1,backupCount=10)一次。

如果每次都调用上面的行,您将创建TimedRotatingFileHandler类的新实例,并创建一个新的日志记录流。这将产生没有时间戳的“mylog”,因为日志被重置,如Python文档中所述:

https://docs.python.org/2/library/logging.handlers.html

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

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)

答案 1 :(得分:2)

首先,请注意:调整.suffix的{​​{1}}字段通常是不明智的,因为实际上有两个依赖于日志文件的字段名称后缀。一个是表示为RotatingFileHandler格式指令的文字后缀,另一个是用于选择要删除的日志文件的正则表达式。如果您设置了一个而没有设置另一个,则可以使代码无法删除文件(这是最有可能的),或者删除错误的文件(更不可能)。幸运的是,您设置的strftime是已使用.suffix设置的.suffix

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

每隔一段时间 - 在轮换间隔和时间,或者在经过一段时间之后如果您不经常记录 - 记录模块会注意到,哦看看时间/日期/任何事情,它& #39; mylog文件的时间。在这一点上:

  • 根据您的mylog参数,使用后缀 选择将现有mylog文件(如果有)重命名为备份名称;
  • 创建 new when(unsuffixed)文件;和
  • 删除所有额外的备份文件,如果现在有太多"。

换句话说,在午夜或午夜之后 - 这是你选择的"当&#34 ;;实际的事件序列仅在记录消息时发生 - 您现有的处理程序注意到它是新文件的时间。它查找后缀部分匹配的mylog文件名:

mylog.<some-suffix>

(这是r"^\d{4}-\d{2}-\d{2}$" 的硬编码;还有其他midnight值的其他硬编码正则表达式。如果现在存在少于when(10)个此类文件,则现有文件仍然存在。否则,将删除足够的最旧 1 这些文件,以便只剩下9个。现有的backupCount会变为mylog或类似(取决于当然的日期),并且会打开一个新的mylog.2017-03-13 - 带有无后缀的当前日志文件。

如果您收到名为mylog的文件(包括空格,小时和分钟),则表示您已使用示例代码中未显示的方式与mylog.2017-03-13 13:00字段进行了混淆。精确到一分钟的格式(.suffixwhen == 'm')是:

when == 'M'

它有一个下划线和一个连字符,而不是空格和冒号,至少在我正在看的源中。

您可能还想查看Using python logging from multiple modules with writing to a file and RotatingFileHandler的一些常规日志记录背景。

1 这个&#34;最老的&#34;取决于字符串排序顺序,这要求文件的名称按字母顺序排序,就像它们在数字上一样。因此,后缀必须是年份,然后是月份,然后是日期,然后是小时,依此类推:使用 self.suffix = "%Y-%m-%d_%H-%M" self.extMatch = r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$" JanFeb等月份名称会导致Apr来自Apr之前,比Feb更早,等等。