如何使用python日志模块为日志文件指定文件名?
我试图使用python模块每小时创建一个新的日志文件,但它似乎不起作用 有时它只创建mylog,有时它包含文件名的日期mylog.YYYYMMDD 我只希望它是mylog.YYYYMMDD。错误在哪里 我的代码:如何使用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
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