一、前言
前面我使用Python制作了几款小工具,有时会有同学向我反馈一些问题,遇到代码问题的话排查起来很麻烦,需要在Pycharm中运行源代码复现当时的情况,那么有什么办法能够提高问题排查的效率呢?
当然是有的。小工具当中都只是简单的几个功能性py文件,并未包含日志记录的功能,若是在运行时记录下关键的信息,那排查问题的效率便会大幅提高
本文主要介绍使用loguru记录日志并自定义日志的输出格式
二、loguru简介
loguru是一个用于Python的高性能、简洁且灵活的日志库。它的目标是提供一种简单的方式来记录应用程序的运行情况,可以帮助开发人员快速地记录应用程序的运行情况,并且方便地进行调试和监控
那么先来安装:
pip install loguru
三、自定义封装
为使得输出的日志更加美观,这里做了简单的封装
创建logger,重置默认的输出格式,再添加格式format参数即可,具体格式参数参考官方文档
import os.path
import sys
from loguru import logger
def uru_log(log_file_prefix):
# 创建logger
logging = logger
# 清空设置
logging.remove()
# 日志文件夹路径不存在则创建
loguru_dir_path = os.path.dirname(os.path.abspath(__file__)) + os.sep + "uru_logs" + os.sep
if not os.path.exists(loguru_dir_path):
os.makedirs(loguru_dir_path)
log_file_path = loguru_dir_path + os.sep + "%s_{time}.log" % log_file_prefix
# 日志输出到文件
logging.add(log_file_path,
format='[{time:YYYY-MM-DD HH:mm:ss,SSS}] ' # 时间
'{module}.{function} - {line} - {level} - {message}', # 模块.方法-行号-级别-内容
retention='720h', # 30天清理一次日志
rotation='00:00' # 每天0点生成新日志文件
)
return logging
使用示例代码:
log = uru_log('uru_log')
def test_fun(value):
# case1
log.info('case1完成!')
# case2
try:
new_value = int(value)
log.info(f'case2执行成功: {type(new_value)}')
except ValueError:
log.exception(f'case2执行失败:')
if __name__ == "__main__":
test_fun('123')
test_fun('1.23')
运行效果:
若要使代码运行时将日志输出到控制台,添加以下代码即可:
# 日志打印到控制台
logging.add(sys.stdout,
format="[<green>{time:YYYY-MM-DD HH:mm:ss,SSS}</green>] " # 时间
"<blue>{module}</blue>.<blue>{function}</blue> - " # 模块.方法
"<cyan>{line}</cyan> - " # 代码行号
"<level>{level}</level> - " # 日志等级
"<level>{message}</level>", # 日志内容
)
运行效果: