loguru 是一个友好的python 日志库
但目前版本尚存在一些问题,比如: logger.add创建的文件是根据应用程序的启动时间来旋转的,而不是基于文件的创建日期
比如说你设置一天一次旋转,但是需要你下次程序再次启动和这次程序启动时间差一天才会旋转,而不是程序运行够一天时间就会旋转。
自定义旋转
作者原本的目的是让每次启动应用程序时启动一个新的日志文件(例如,使用log .add("file_{time}.log"))才有意义。 这样,就不用创建“file_2019-02-18_12:00 -00”。日志”、“file_2019-02-18_13-00-00。日志”、“file_2019 - 02 - 18 - _14 - 00 - 00. -日志”…无限期地,这只保留最新的
但这样显示不符合更高的需求实现,比如说我想实现 一个小时一个日志文件,最近7天的保留, 超过7天的,按天压缩后存储
这样一个小时一个文件的就没办法实现,所以才需要自定义函数,可喜的是logger.add的各个旋转参数都支持传入函数,比如我想实现一个小时一个文件,就可以使用如下代码:
一小时一文件
def should_rotate(message, file):
filepath = os.path.abspath(file.name)
creation = os.path.getctime(filepath)
now = message.record["time"].timestamp()
maxtime = 60 * 60 # 1 hour in seconds
return now - creation > maxtime
logger.add("file.log", rotation=should_rotate)
复制代码
超过七天的按天存储
def logs_func(logs):
day = datetime.datetime.today().date() - datetime.timedelta(days=3)
file_list = []
new_zip = zipfile.ZipFile("request_log_" + str(day) + ".zip", 'w')
for log in logs:
filepath = os.path.abspath(log)
creation = os.path.getctime(filepath)
if time.gmtime(time.time() - creation).tm_mday == 7:
file_list.append(log)
for tar in file_list:
new_zip.write(tar)
new_zip.close()
for tar in file_list:
filepath = os.path.abspath(tar)
os.remove(filepath)
logger.add("file.log", rotation=should_rotate, retention=logs_func)
复制代码
结语
作者也认为基于文件日期创建的旋转参数比应用程序启动时间更有意义。应该未来的版本会更改。 github讨论地址