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

目录
  • 1、loguru的安装
    • 1.1、pip安装
    • 1.2、pycharm下安装
  • 2、loguru的简单使用
    • 2.1、使用非常简单
    • 2.2、add()函数
    • 2.3、创建记录日志文件
      • 2.3.1、创建日志文件
      • 2.3.2、指定创建日志文件名
      • 2.3.3、rotation 滚动记录日志文件
      • 2.3.4、retention 指定日志保留时长
      • 2.3.4、compression 配置文件压缩格式
    • 2.4、异常捕获
      • 2.4.1、catch装饰器 方法
      • 2.4.2、exception 方法
  • 3、loguru在多模块情况下的使用
  • 4、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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python第三方异步日志库loguru简介

    目录 一.引言 二.安装loguru 三.特性 3.1 开箱即用 3.2 无需初始化,导入函数即可使用 3.3 更容易的文件日志记录与转存/保留/压缩方式 3.4 更优雅的字符串格式化输出 3.5 可以在线程或主线程中捕获异常 3.6 可以支持自定义颜色 3.7 支持异步,且线程和多进程安全 3.8 支持异常完整性描述 3.9 更好的日期时间处理 3.10 支持邮件通知 四.总结 一.引言 在编写调试Python代码过程中,我们经常需要记录日志,通常我们会采用python自带的内置标准库logg

  • python+pytest接口自动化之日志管理模块loguru简介

    目录 安装 简单示例 add()常用参数说明 使用 python自带日志管理模块logging,使用时可进行模块化配置,详细可参考博文Python日志采集(详细). 但logging配置起来比较繁琐,且在多进行多线程等场景下使用时,如果不经过特殊处理,则容易出现日志丢失或记录错乱的情况. python中有一个用起来非常简便的第三方日志管理模块--loguru,不仅可以避免logging的繁琐配置,而且可以很简单地避免在logging中多进程多线程记录日志时出现的问题,甚至还可以自定义控制台输出的

  • python3中超级好用的日志模块-loguru模块使用详解

    目录 一. 使用logging模块时 二. loguru模块的基础使用 三. logurr详细使用 3.1 add 方法的定义 3.2 基本参数 3.3 删除 sink 3.4 rotation 配置 3.5 retention 配置 3.6 compression 配置 3.7 字符串格式化 3.8 Traceback 记录 一. 使用logging模块时 用python写代码时,logging模块最基本的几行配置,如下: import logging logging.basicConfig(

  • python日志模块loguru详解

    目录 前言 使用步骤 安装库 简单使用方法 配置 异常追溯 总结 前言 在部署一些定时运行或者长期运行的任务时,为了留存一些导致程序出现异常或错误的信息,通常会才用日志的方式来进行记录这些信息.python内置的logging标准库博主是没用过,今天给大家介绍loguru,loguru 库的使用可以说是十分简单,希望通过本文大家再也不用通过print来排查代码了. 使用步骤 安装库 pip install loguru 简单使用方法 from loguru import logger logge

  • Python3 Loguru输出日志工具的使用

    目录 一.前言 为什么要使用loguru? 二.优雅的使用loguru 1. 安装loguru 2.功能特性介绍 3. 开箱即用,无需准备 4. 更容易的文件日志记录与转存/保留/压缩方式 5. 更优雅的字符串格式化输出 6. 在子线程或主线程中捕获异常 7. 可以设置不同级别的日志记录样式 8.支持异步且线程和多进程安全 9. 异常的完整性描述 10. 结构化日志记录 11. 惰性计算 12. 可定制的级别 13. 适用于脚本和库 14. 完全兼容标准日志记录 15. 非常方便的解析器 16.

  • Python中loguru日志库的使用

    目录 1.概述 2.常见用法 2.1.显示格式 2.2.写入文件 2.3.json日志 2.4.日志绕接 2.5.并发安全 3.高级用法 3.1.接管标准日志logging 3.2.输出日志到网络服务器 3.3.与pytest结合 附录 1.概述 python中的日志库logging使用起来有点像log4j,但配置通常比较复杂,构建日志服务器时也不是方便.标准库logging的替代品是loguru,loguru使用起来就简单的多. loguru默认的输出格式是:时间.级别.模块.行号以及日志内容

  • Python日志logging模块功能与用法详解

    本文实例讲述了Python日志logging模块功能与用法.分享给大家供大家参考,具体如下: 本文内容: logging模块的介绍 logging模块的基础使用 logging模块的扩展使用 logging中的Filter 使用配置文件配置logging和logger 小技巧 想要了解更多?不如看看官方文档. 首发日期:2018-07-05 logging模块的介绍: 它是一个python标准库,所以它的通用性很高,所有的python模块都可以与它合作参与日志记录. 日志级别: 基本 中文意义

  • Python 日志logging模块用法简单示例

    本文实例讲述了Python 日志logging模块用法.分享给大家供大家参考,具体如下: demo.py(日志,输出到控制台): import logging # 导入logging模块 # 日志级别默认是WARNING logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s') # 开始使用log功能 l

  • Python中sys模块功能与用法实例详解

    本文实例讲述了Python中sys模块功能与用法.分享给大家供大家参考,具体如下: sys-系统特定的参数和功能 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数.它始终可用. sys.argv 传递给Python脚本的命令行参数列表.argv[0]是脚本名称(依赖于操作系统,无论这是否是完整路径名).如果使用-c解释器的命令行选项执行命令,argv[0]则将其设置为字符串'-c'.如果没有脚本名称传递给Python解释器,argv[0]则为空字符串. 要循环标准输入或命

  • Python argparse中的action=store_true用法小结

    目录 Python argparse中的action=store_true用法 前言 示例 官方文档 多了解一点儿 自定义 小结 思考 补充:python库Argparse中的可选参数设置 action=‘store_true‘ 的用法 一.没有default 二.有default Python argparse中的action=store_true用法 前言 Python的命令行参数解析模块学习. 示例 参数解析模块支持action参数,这个参数可以设置为’store_true’.‘store

  • Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后join这些线程结束,例如: for i in range(10): t = ThreadTest(i) thread_arr.append(t) for i in range(10): thread_arr[i].start() for i in range(10): thread_arr[i].joi

  • python日志logging模块使用方法分析

    本文实例讲述了python日志logging模块使用方法.分享给大家供大家参考,具体如下: 一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创建一个logger logger = logging.getLogger('mylogger') logger.setLevel(logging.DEBUG) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler('test.log') fh

  • Python中os模块功能与用法详解

    本文实例讲述了Python中os模块功能与用法.分享给大家供大家参考,具体如下: OS模块 Python的os模块封装了常见的文件和目录操作,本文只是列出部分常用的方法,更多的方法可以查看官方文档. 下面是部分常见的用法: 方法 说明 os.mkdir 创建目录 os.rmdir 删除目录 os.rename 重命名 os.remove 删除文件 os.getcwd 获取当前工作路径 os.walk 遍历目录 os.path.join 连接目录与文件名 os.path.split 分割文件名与目

  • python 日志 logging模块详细解析

    Python 中的 logging 模块可以让你跟踪代码运行时的事件,当程序崩溃时可以查看日志并且发现是什么引发了错误.Log 信息有内置的层级--调试(debugging).信息(informational).警告(warnings).错误(error)和严重错误(critical).你也可以在 logging 中包含 traceback 信息.不管是小项目还是大项目,都推荐在 Python 程序中使用 logging.本文给大家介绍python 日志 logging模块 介绍. 1 基本使用

  • python中pathlib模块的基本用法与总结

    前言 相比常用的 os.path而言,pathlib 对于目录路径的操作更简介也更贴近 Pythonic.但是它不单纯是为了简化操作,还有更大的用途. pathlib 是Python内置库,Python 文档给它的定义是:The pathlib module – object-oriented filesystem paths(面向对象的文件系统路径).pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统. 更多详细的内容可以参考官方文档:https://docs.python.

随机推荐