百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

更优雅的 Python 日志解决方案 loguru

off999 2024-10-07 12:18 52 浏览 0 评论

更优雅的 Python 日志解决方案 loguru

Loguru是一个旨在为Python带来愉悦的日志记录库。

官方文档:https://github.com/Delgan/loguru

loguru 封装脚本

#!/usr/bin/python
# -*- coding: utf-8 -*-

# pip install loguru
import sys
from loguru import logger


def get_logger(log_file=None):
    """
    日志规则
    :param log_file:日志文件名,如为None,则不写入日志文件
    :return:
    """
    # 清除之前所有的设置,包括终端打印的设置
    logger.remove(handler_id=None)

    # 添加终端日志输出
    logger.add(
        sink=sys.stdout,
        level='INFO',  # 设置日志最低级别,如果为INFO,则DEBUG日志则不会显示
        format="<light-green>{time:YYYY-MM-DD HH:mm:ss}</light-green> | "  # 时间,高亮绿显示
               "<level>{level:>8}:</level> "  # 等级
               "<level>{message}</level>",  # 日志内容
    )

    # 如果需要写入文件,则传入文件路径
    if log_file:
        logger.add(
            sink=log_file,
            # serialize=True,  # 序列化为 json,以 json 格式显示日志的每一行
            encoding='utf-8',  # 避免中文乱码
            rotation="50 MB",  # 日志文件大小超过50MB则创建新日志文件
            level='DEBUG',  # 设置日志最低级别,默认DEBUG
            format="{time:YYYY-MM-DD HH:mm:ss} | "  # 时间
                   "{level:<8} | "  # 等级
                   "{process.name}:{process.id} | "  # 进程名:进程ID
                   "{thread.name}:{thread.id} | "  # 线程名:线程ID
                   "{name}.{module}.{function}:{line} - "  # 模块名.方法名
                   "<level>{message}</level>",  # 日志内容
        )
    return logger


my_logger = get_logger('loguru.log')


def my_func():
    my_logger.debug('这是一个debug级别的信息')
    my_logger.info('这是一个info级别的信息')
    my_logger.success('这是一个success级别的信息')
    my_logger.warning('这是一个warning级别的信息')

    try:
        with open('test.log') as f:
            f.readlines()
    except:
        logger.exception('打开文件报错')

    my_logger.error('这是一个error级别的信息')
    my_logger.critical('这是一个critical级别的信息')


if __name__ == '__main__':
    my_func()

loguru 详细介绍

add 参数说明

  • sink: 用来确定日志的输出路径,sink的选择如下:sink可以传入一个file对象,例如sys.stderr或者open('file.log','w')都可以;sink可以直接传入一个str字符串或者pathlib.Path对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志数据输入进去;sink可以是一个方法,可以自行定义输出实现;sink还可以是一个自定义的类。具体的实现规范可以参见官方文档;
  • level: 标志日志的级别,低于该级别的日志将不会输出,如下图,值越小的日志级别越低级别值方法TRACE5logger.trace()DEBUG10logger.debug()INFO20logger.info()SUCCESS25logger.success()WARNING30logger.warning()ERROR40logger.error()CRITICAL50logger.critical()
  • format: 格式化输出日志信息取值作用elapsed从程序开始经过的时间差exception格式化异常(如果有),否则为Noneextra用户绑定的属性字典(参见bind())file进行日志记录调用的文件function进行日志记录调用的函数level用于记录消息的严重程度line源代码中的行号message记录的消息(尚未格式化)module进行日志记录调用的模块name进行日志记录调用的__name__process进行日志记录调用的进程名thread进行日志记录调用的线程名time发出日志调用时的可感知的本地时间
  • rotation: 设置日志的生成大小、生成时间、保存最长时间等
  • retention: 指定日志保留时长,通常,一些久远的日志文件,需要周期性的去清除,避免日志堆积,浪费存储空间
  • compression: 配置文件压缩格式,比如使用 zip 文件格式保存
  • serialize: 希望输出类似于Json-line格式的结构化日志,可以通过 serialize 参数,将日志信息序列化的json格式写入log 文件,最后可以将日志文件导入类似于MongoDB、ElasticSearch 中用作后续的日志分析

仅输出到命令行

# pip install loguru
from loguru import logger

logger.debug('这是一个debug级别的信息')
logger.info('这是一个info级别的信息')
logger.warning('这是一个warning级别的信息')
logger.error('这是一个error级别的信息')
logger.critical('这是一个critical级别的信息')
  • 终端日志输出

loguru 默认以时间,级别,函数名,模块名,行号,信息的顺序来输出日志。

同时输出到文件

from loguru import logger


# 输出日志到文件(下图日志文件上部分)
# logger.add('loguru.log')
# 自定义格式输出到日志格式,在 add 中配置的格式只对写入日志文件的内容生效,命令行仍不变(下图日志文件下部分)
logger.add('loguru.log', format='[{time}] [{level}]: {message}')

logger.debug('这是一个debug级别的信息')
logger.info('这是一个info级别的信息')
logger.warning('这是一个warning级别的信息')
logger.error('这是一个error级别的信息')
logger.critical('这是一个critical级别的信息')
  • 日志文件记录

如没使用路径 'loguru.log' ,则会在脚本所在目录创建日志文件。也可以在日志路径中添加时间:

logger.add('loguru_{time}.log', format='[{time}] [{level}]: {message}')
# 则会生成类似 loguru_2023-02-13_19-45-41_059677.log 的日志文件

format中的{time}修改为{time:YYYY-MM-DD HH:mm:ss},那么时间会自动处理成2023-02-13 20:16:09

日志转存/保留/压缩

用了 loguru 还可以非常方便地使用 rotation 配置,比如想一天输出一个日志文件,或者文件太大了自动分隔日志文件,可以直接使用 add 方法的 rotation 参数进行配置:

# 日志文件转存
logger.add("file_1.log", rotation="500 MB")    # 当日志文件超过 500MB 时自传转存
logger.add("file_2.log", rotation="12:00")     # 每天中午创建新的日志文件
logger.add("file_3.log", rotation="1 week")    # 每一周创建日志文件

# 日志文件清理
logger.add("file_X.log", retention="10 days")  # 自动清理10天之前的日志文件

# 日志文件压缩
logger.add("file_Y.log", compression="zip")    # 使用zip压缩日志文件

日志格式化

Loguru 更喜欢更优雅和强大的{}格式化而不是% ,日志记录函数实际上等效于 str.format()

logger.debug('这是一个debug级别的信息,数据1:{},数据2:{data2}', 'qwe', data2=100)

# 2023-02-13 19:59:43.671 | DEBUG    | __main__:<module>:8 - 这是一个debug级别的信息,数据1:qwe,数据2:100

在线程或主线程中捕获异常

用法1

是否遇到程序意外崩溃,而在日志文件中没有看到任何内容?是否注意到线程中发生的异常没有被记录?可以使用catch()装饰器/上下文管理器解决这个问题,该管理器确保任何错误都被正确地传播到日志记录器。

from loguru import logger

logger.add('loguru.log', format='[{time}] [{level}]: {message}')


@logger.catch
def my_function(x, y, z):
    # 异常捕获
    return 1 / (x + y + z)


my_function(1, 0, -1)
  • 终端日志输出
  • 日志文件loguru.log记录

用法2

针对exception, Loguru也有专门的分类,且可以很方便的定位到引发错误的行。

from loguru import logger

logger.add('loguru.log')

try:
    if test:
        print('test')
except NameError:
    logger.exception('异常')
  • 那么在终端和日志文件中将出现下方的异常捕获

自定义颜色

如果终端兼容,Loguru会自动为日志添加颜色。可以自定义定义自己喜欢的样式。

import sys
from loguru import logger

# logger 默认包含终端打印功能,清除终端打印功能
logger.remove(handler_id=0)
# 清除之前所有的设置,包括终端打印的设置
# logger.remove(handler_id=None)

# 添加自定义的终端打印
logger.add(sys.stdout, colorize=True, format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> <level>{message}</level>")

logger.info('这是一个info级别的信息')
logger.warning('这是一个warning级别的信息')
  • 如果不添加logger.remove(handler_id=0),则一条日志会输出两行,因为默认有终端打印功能。
  • 清除默认的终端打印功能后正常。

不同级别分别记录

warning以及warning以上级别的log,打印到屏幕同时也记录到文件,warning以下的级别只打印不记录文件。

# 清除之前所有的设置,包括终端打印的设置
logger.remove(handler_id=None)

cmd_log = logger.add(sys.stdout)   #终端打印
file_log = logger.add("loguru.log" , level="WARNING") # 文件保存,最低记录级别为WARNING
logger.info("info日志,打印到终端,不保存到文件")
logger.error("error日志,打印到终端,且保存到文件")

配置日志过滤规则

我们通过实现自定义方法error_only,判断日志级别,当日志级别为ERROR,返回TRUE,我们在add方法设置filter参数时,设置为error_only,即可过滤掉ERROR以外的所有日志 。

from loguru import logger


def error_only(record):
    """
    若日志级别为ERROR, 输出TRUE
    """
    return record["level"].name == "ERROR"


# ERROR以外级别日志被过滤掉
logger.add("loguru.log", filter=error_only)

logger.warning('这是一个warning级别的信息')
logger.error('这是一个error级别的信息')
logger.critical('这是一个critical级别的信息')

同一个项目不同模块日志

import sys
from loguru import logger

logger.remove(handler_id=None)

cmd_log = logger.add(sys.stdout)  # 添加终端打印

# 日志文件,在filter中设置仅针对record name == "module1"的实例化对象。
file_log_module1 = logger.add("module1.log",
                              level='INFO',
                              filter=lambda record: record["extra"].get("name") == "module1",
                              enqueue=True)

# 日志文件,在filter中设置仅针对record name == "module2"的实例化对象。
file_log_module2 = logger.add("module2.log",
                              level='INFO',
                              filter=lambda record: record["extra"].get("name") == "module2",
                              enqueue=True)

bind_log_module1 = logger.bind(name="module1")
bind_log_module2 = logger.bind(name="module2")

bind_log_module1.info("打印+保存 module1.log")
bind_log_module2.info("打印+保存 module2.log")


# 以上执行后,会输出
# 2023-02-13 20:54:47.625 | INFO     | __main__:<module>:27 - 打印+保存 module1.log
# 2023-02-13 20:54:47.627 | INFO     | __main__:<module>:28 - 打印+保存 module2.log

# 同时module1.log中记录
# 2023-02-13 20:54:47.625 | INFO     | __main__:<module>:27 - 打印+保存 module1.log
# module2.log中记录
# 2023-02-13 20:54:47.627 | INFO     | __main__:<module>:28 - 打印+保存 module2.log

enqueue=True:支持异步且线程和多进程安全。默认情况下,添加到 logger 中的日志信息都是线程安全的。但这并不是多进程安全的,可以通过添加 enqueue 参数来确保日志完整性。 如果想要在异步任务中使用日志记录的话,也是可以使用同样的参数来保证的。并且通过 complete() 来等待执行完成。

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: