我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python日志管理模块Loguru的用法小结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python日志管理模块Loguru的用法小结

python的日志管理模块可以用自带的logging模块,也可以用第三方的Loguru模块,关于logging和loguru模块的简单使用可以参考以下文章,写的还是不错的:logging 和 loguru的使用

关于logging模块的详细使用,可以参考这篇文章:logging模块详细使用。

本片文章只记录loguru模块的使用,包括简单的用法,以及在多模块多线程下的使用。

1、loguru的安装

1.1、pip安装

pip\pip3 install loguru

1.2、pycharm下安装

2、loguru的简单使用

2.1、使用非常简单

Use out of box without boilerplate。

loguru的用法非常简单,在 loguru 中有且仅有一个对象:logger。为了使用方便,logger在使用时,是提前配置好的,并且开始是默认输出至stderr(但是这些完全是可以再进行配置的),而且打印出的log信息默认是配置了颜色的。如下所示,loguru的使用真的是非常简单:

from loguru import logger
logger.debug("This's a log message")

上面的日志记录语句,默认向stderr(控制台)打印了一条输出语句,输出结果如下所示:

可以看出,loguru默认配置了一套日志输出格式,有时间、级别、模块名、行号以及日志信息,不需要手动创建 logger,直接使用即可,另外其输出还是彩色的,看起来会更加友好。所以我们不需要提前配置什么,直接用就可以。

2.2、add()函数

No Handler、no Formatter、no Filter:one function to rule them all。

在使用logging模块是,我们需要手动配置Handler、Formatter以及Filter,需要调用不同的函数进行配置,但是在loguru中,只需要一个add()函数即可。通过add()函数,我们可以设置Handler,设置Formatter,Filter Message以及设置Level。使用示例:

import sys
from loguru import logger
 
logger.add(sys.stderr, format="{time} {level} {message}", filter="my_module", level="INFO")
 
logger.debug("This's a new log message")

在上述代码中,通过add()函数指明了Handler为控制台输出,指定了format的格式,以及filter和level。然后就可以输出日志信息了:

add()函数原型定义如下:

def add(
        self,
        sink,
        *,
        level=_defaults.LOGURU_LEVEL,
        format=_defaults.LOGURU_FORMAT,
        filter=_defaults.LOGURU_FILTER,
        colorize=_defaults.LOGURU_COLORIZE,
        serialize=_defaults.LOGURU_SERIALIZE,
        backtrace=_defaults.LOGURU_BACKTRACE,
        diagnose=_defaults.LOGURU_DIAGNOSE,
        enqueue=_defaults.LOGURU_ENQUEUE,
        catch=_defaults.LOGURU_CATCH,
        **kwargs
    ):
    pass

里面有好多参数可以用来配置不同的属性。 这里面有一个非常重要的参数sink。通过 sink 我们可以传入多种不同的数据结构,汇总如下:

  • sink 可以传入一个 file 对象,例如 sys.stderr 或者 open('file.log', 'w') 都可以。
  • sink 可以直接传入一个 str 字符串或者 pathlib.Path 对象,其实就是代表文件路径的,如果识别到是这种类型,它会自动创建对应路径的日志文件并将日志输出进去。
  • sink 可以是一个方法,可以自行定义输出实现。
  • sink 可以是一个 logging 模块的 Handler,比如 FileHandler、StreamHandler 等等,这样就可以实现自定义 Handler 的配置。sink 还可以是一个自定义的类,具体的实现规范可以参见官方文档。

2.3、创建记录日志文件

Easier file logging with rotation / retention / compression。

2.3.1、创建日志文件

我们可以通过传入一个文件名字符串或者文件路径,loguru就会自动创建一个日志文件,如下所示:

from loguru import logger
logger.add("runtime.log")       # 创建了一个文件名为runtime的log文件
 
logger.debug("This's a log message in file")

上面的程序就会在程序文件所在目录下创建一个名为runtime.log的文件,而且会在文件中记录日志:

同时也会在控制台输出日志信息:

如果不想在控制台也输出日志信息,因为logger是默认输出至stderr的,所以只需要在之前把它给remove掉就好了:

from loguru import logger
 
logger.remove(handler_id=None)
 
logger.add("runtime.log")       # 创建了一个文件名为runtime的log文件
 
logger.debug("This's a log message in file")

这样就不会在控制台输出日志信息了。 

2.3.2、指定创建日志文件名

在add()创建日志文件的时候,可以通过添加占位符的方式添加文件的日期,如下所示:

from loguru import logger
 
logger.add("runtime_{time}.log")       # 创建了一个文件名为runtime的log文件
 
logger.debug("This's a log message in file")

这样就会创建一个带有日期的log文件。

2.3.3、rotation 滚动记录日志文件

通过配置rotation参数,指定日志文件滚动记录的条件,如下所示:

 1)、

logger.add("file_1.log", rotation="500 MB")    # Automatically rotate too big file

通过这样的配置我们就可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个新的 log 文件。我们可以在创建文件的时候加一个(time)占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。

2)、

logger.add("file_2.log", rotation="12:00")     # New file is created each day at noon

通过上面的配置,可以实现没填中午12:00创建一个log文件输出了。 

3)、

logger.add("file_3.log", rotation="1 week")    # Once the file is too old, it's rotated

通过上面的配置可以实现每隔1周创建一个新的log文件输出了。

2.3.4、retention 指定日志保留时长

通过配置retention参数,可以指定日志的保留时长:

logger.add("file_X.log", retention="10 days")  # Cleanup after some time

通过上面的配置,就可以指定日志最多保留10天,每隔10天之后就会清理旧的日志,这样就不会造成内存浪费。

2.3.4、compression 配置文件压缩格式

通过配置compression参数可以指定日志文件的压缩格式:

logger.add("file_Y.log", compression="zip")    # Save some loved space

通过上面的配置,可以指定日志文件的压缩格式为zip格式,可以节省存储空间。

2.4、异常捕获

Exceptions catching within threads or main。

最让我感到loguru模块功能强大的地方就是它的异常捕获功能。如果程序在运行过程出现崩溃或错误,记录日志是我们回溯程序执行过程的一个重要方式,但是很多时候,根据日志并不知道程序为什么出错或者看不出来程序具体出错在哪些地方,此时如果我们能在日志中记录当异常发生时的情况或者信息,那么多我们解决程序问题来说,简直事半功倍。

在loguru模块中,异常的捕获有两种方式:

2.4.1、catch装饰器 方法

通过catch装饰器的方式实现异常捕获:

from loguru import logger
 
logger.add("runtime.log") 
 
@logger.catch
def my_function(x, y, z):
    return 1 / (x + y + z)    # An error? It's caught anyway!
 
my_function(0, 0, 0)

 上面的代码中,通过catch装饰器对函数my_function进行装饰,这样,当该函数出现异常时,就会打印出异常日志信息,如下所示:

在日志信息中,不仅指明了异常出现的地方,而且把参数的值也记录下来了。

2.4.2、exception 方法

通过exception方法也可以实现异常的捕获与记录:

from loguru import logger
 
logger.add("runtime.log") 
 
def my_function1(x, y, z):
    try:
        return 1 / (x + y + z)
    except ZeroDivisionError:
        logger.exception("What?!")
 
my_function1(0, 0, 0)

记录的日志信息如下所示:

3、loguru在多模块情况下的使用

Asynchronous, Thread-safe, Multiprocess-safe。

由于在 loguru 中有且仅有一个对象:logger。所以loguru是可以在多块module文件中使用的,而且不会出现冲突:

exceptions_catching2_03.py:

from loguru import logger
 
def func(a, b):
    logger.info("Process func")
    return a / b
 
def nested(c):
    try:
        func(5, c)
    except ZeroDivisionError:
        logger.exception("What?!")

test.py:

#coding:utf-8
 
from loguru import logger
 
import exceptions_catching2_03 as ec3
 
if __name__=='__main__':
 
    logger.add("run.log")
 
    logger.info("Start!")
 
    ec3.nested(0)
 
    logger.info("End!")

运行结果如下所示:

4、loguru在多线程情况下的使用

Asynchronous, Thread-safe, Multiprocess-safe

所有添加至logger的sink默认都是线程安全的,所以loguru也可以很安全的在多线程的情形下使用:

#coding:utf-8
 
from atexit import register
from random import randrange
from threading import Thread, Lock, current_thread
from time import sleep, ctime
 
from loguru import logger
 
class CleanOutputSet(set):
    def __str__(self):
        return ','.join(x for x in self)
 
lock = Lock()
loops = (randrange(2, 5) for x in range(randrange(3, 7)))
remaining = CleanOutputSet()
 
def loop(nsec):
    myname = current_thread().name
 
    logger.info("Startted {}", myname)
 
    '''
    锁的申请和释放交给with上下文管理器
    '''
    with lock:
        remaining.add(myname)
    sleep(nsec)
 
    logger.info("Completed {} ({} secs)", myname, nsec)
 
    with lock:
        remaining.remove(myname)
        logger.info("Remaining:{}", (remaining or 'NONE'))
 
'''
_main()函数是一个特殊的函数,只有这个模块从命令行直接运行时才会执行该函数(不能被其他模块导入)
'''
def _main():
    for pause in loops:
        Thread(target=loop, args=(pause,)).start()
 
'''
这个函数(装饰器的方式)会在python解释器中注册一个退出函数,也就是说,他会在脚本退出之前请求调用这个特殊函数
'''
@register
def _atexit():
    logger.info("All Thread DONE!")
    logger.info("\n===========================================================================\n")
 
if __name__=='__main__':
    logger.add("run.log")
 
    _main()

日志记录文件如下所示:

上面代码创建了3个线程,每个线程都正确打印出了日志信息。 

到此这篇关于Python 日志管理模块Loguru的用法小结的文章就介绍到这了,更多相关Python 日志管理模块 Loguru内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python日志管理模块Loguru的用法小结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python日志管理模块Loguru的用法小结

这篇文章主要介绍了Python日志管理模块Loguru的用法小结,本篇文章只记录loguru模块的使用,包括简单的用法,以及在多模块和多线程下的使用,需要的朋友可以参考下
2023-02-15

Python json模块常用方法小结

本文主要介绍了Python json模块常用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-22

Laravel怎么使用Observer实现日志管理模块

这篇文章主要介绍“Laravel怎么使用Observer实现日志管理模块”,在日常操作中,相信很多人在Laravel怎么使用Observer实现日志管理模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Lar
2023-06-20

Python中内置的日志模块logging用法详解

logging模块简介 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可
2022-06-04

Python中的time模块与datetime模块用法总结

time模块 time模块是包含各方面对时间操作的函数. 尽管这些常常有效但不是所有方法在任意平台中有效. time用struct_time表示时间import time# time.struct_time(tm_year=2015, tm
2022-06-04

详解Python中contextlib上下文管理模块的用法

咱们用的os模块,读取文件的时候,其实他是含有__enter__ __exit__ 。 一个是with触发的时候,一个是退出的时候。with file('nima,'r') as f:print f.readline()那咱们自己再实现一
2022-06-04

Node.js利用debug模块打印出调试日志的方法

前言 大家都知道在node程序开发中时,经常需要打印调试日志。用的比较多的是debug模块,比如express框架中就用到了。下文简单举几个例子进行说明。文中相关代码示例,可在这里找到。 备注:node在0.11.3版本也加入了util.d
2022-06-04

Python使用logging结合decorator模式实现优化日志输出的方法

本文实例讲述了Python使用logging结合decorator模式实现优化日志输出的方法。分享给大家供大家参考,具体如下: python内置的loging模块非常简便易用, 很适合程序运行日志的输出。 而结合python的装饰器模式,则
2022-06-04

java用户日志管理的方法是什么

Java用户日志管理的方法有多种,以下是其中几种常用的方法:1. 使用Java内置的日志管理框架 - Java提供了一个标准的日志框架java.util.logging(JUL),它是Java平台的一部分。可以使用该框架来记录和管理日志信息
2023-08-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录