我正在尝试使用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)
答案 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
文件(如果有)重命名为备份名称; 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
字段进行了混淆。精确到一分钟的格式(.suffix
或when == '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}$"
,Jan
,Feb
等月份名称会导致Apr
来自Apr
之前,比Feb
更早,等等。