Python 日志模块Loguru基本使用和封装使用

【一】介绍

  • Loguru是一个用于Python的日志库,它的设计目标是使日志记录变得简单、快速且易于阅读。

(1)Loguru介绍

  • 简洁的API:Loguru提供了一个简洁的API,使得在Python项目中使用日志变得更加容易。只需导入loguru模块,然后使用其提供的函数来记录日志。
  • 自动格式化:Loguru会自动将日志消息格式化为带有时间戳、日志级别和消息内容的字符串,无需手动处理。这使得在查看日志时可以轻松地识别出每条日志的时间和级别。
  • 多种输出方式:Loguru支持将日志输出到控制台、文件、Slack、GitHub等不同的地方。可以根据需要选择合适的输出方式,并设置不同的日志级别以关注重要信息。
  • 配置文件支持:Loguru允许使用JSON格式的配置文件来自定义日志记录的行为,轻松地为应用程序添加自定义的日志处理器或过滤器。
  • 异常追踪:Loguru可以自动捕获和记录异常信息,并将其与日志消息一起输出,使调试和排查问题更加方便。
  • 彩色输出支持:Loguru支持在控制台输出中添加颜色,使日志更易于阅读和区分。
  • 装饰器集成:Loguru提供了日志装饰器,可以直接在函数或类上应用,避免在每个可能产生日志的地方插入日志语句。

(2)Loguru与logging的区别和优势

  • 简洁性:与logging相比,Loguru的API更加简洁易用。
  • 自动化:Loguru提供了许多自动化的功能,如自动格式化、异常追踪和彩色输出等。
  • 灵活性:Loguru支持多种输出方式和自定义方式,如控制台、文件、Slack、GitHub等输出目标,以及自定义日志格式、颜色编码、文件记录等。
  • 高效性:Loguru使用了异步I/O技术,可以提高日志记录的效率。

【二】使用

(1)简单使用

  • 安装
pip install loguru
  • 示例

    • from loguru import logger
      
      # 添加一个文件输出目标
      logger.add('my_file_log.log')
      # 记录一条日志,它将同时输出到控制台和文件
      logger.info('这是一条info级别日志')
      logger.warning('这是一条warning级别日志')
      logger.error('这是一条error级别日志')
      logger.critical('这是一条critical级别日志')
      logger.debug('这是一条debug级别日志')
      
      
    • image-20240510192546907

  • 说明

    • logger.add()方法添加了一个文件输出目标,指定了日志文件的名称(my_log_file.log
    • logger对象的不同方法(如info(), warning(), error(), critical(), debug())来记录不同级别的日志消息。
      • 除了debug,他们的测试等级依次增加

(2)add方法

  • 源码

    • class Logger:
       @overload
       def add(
           self,
           sink: Union[TextIO, Writable, Callable[[Message], None], Handler],
           *,
           level: Union[str, int] = ...,
           format: Union[str, FormatFunction] = ...,
           filter: Optional[Union[str, FilterFunction, FilterDict]] = ...,
           colorize: Optional[bool] = ...,
           serialize: bool = ...,
           backtrace: bool = ...,
           diagnose: bool = ...,
           enqueue: bool = ...,
           context: Optional[Union[str, BaseContext]] = ...,
           catch: bool = ...
      
  • sink:

    • 这是指定日志输出的地方,可以是一个文件名、文件对象、标准输出(例如 sys.stderrsys.stdout)、一个URL(如向Slack发送消息)等。

    • logger.add("my_file_log.log")  # 输出到my_file_log.log文件  
      logger.add(sys.stdout)  # 输出到标准输出
      
  • level:

    • 用于指定日志级别。如果指定了级别,则只有该级别及以上的日志才会被输出到该sink。如果不指定,则使用全局级别

    • logger.add("my_file_log.log", level="INFO")  # 只记录INFO级别及以上的日志
      
  • format:

    • 用于定义日志的格式。这是一个字符串,可以使用各种占位符来自定义输出格式。

    • logger.add("my_file_log.log", format="{time} {level} {message}")
      
    • 可填参数

      • 占位符描述
        %(asctime)s日志事件发生的时间
        %(levelname)s日志级别名称
        %(message)s日志消息,传递给logger方法的字符串
        %(name)s用于记录日志的logger的名称
        %(pathname)s调用日志记录方法的源文件的完整路径名
        %(filename)s调用日志记录方法的源文件的文件名。
        %(module)s调用日志记录方法的模块名
        %(process)d进程ID
        %(thread)d线程ID(可能不是所有平台都可用)
        %(threadName)s线程名(可能不是所有平台都可用)
        %(lineno)d调用日志记录方法的源代码行号
        %(funcName)s调用日志记录方法的函数名
        %(processName)s进程名
      • import logging  
          
        logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')  
        logger = logging.getLogger(__name__)  
        logger.info('This is an info message.')
        
    • 如何指定时间格式

      • 日志内容信息只保留年月日信息,十分秒不要

        • from loguru import logger  
            
          # 自定义时间格式,仅包含年、月、日  
          format_string = "{time:YYYY-MM-DD} | {level} | {message}"  
            
          # 添加一个日志输出配置,指定时间格式  
          logger.add(sink="my_file_log.log", format=format_string)  
            
          logger.info("这是一条日志消息")
          
      • 日志文件名字带有时间,带有年月日

        • from loguru import logger
          
          # 添加一个文件输出目标
          logger.add('my_file_log{time:YYYY-MM-DD}.log')
          # 记录一条日志,它将同时输出到控制台和文件
          logger.info('这是一条info级别日志')xxxxxxxxxx from loguru import logger# 添加一个文件输出目标logger.add('my_file_log{time:YYYY-MM-DD}.log')# 记录一条日志,它将同时输出到控制台和文件logger.info('这是一条info级别日志')
          
  • filter:

    • 可选的函数或条件表达式,用于决定是否输出日志。如果提供了 filter,则只有满足该 filter 条件的日志才会被输出到该sink。

    • def filter_fn(record):  
          # 返回布尔值,记录的级别不是DEBUG就返回True
          return record["level"].name != "DEBUG"  
       
      logger.add("my_file_log.log", filter=filter_fn)  # 不记录DEBUG级别的日志
      
  • colorize:

    • 用于指定是否对日志消息进行颜色编码(布尔值)。默认为True,控制台输出是颜色编码的,但文件输出不是。

    • logger.add("my_file_log.log", colorize=True) 
      
  • serialize:

    • 默认为False,如果为True,则日志消息会被序列化为JSON格式。这对于非文本输出(如发送到Elasticsearch)很有用。

    • logger.add("my_file_log.log", serialize=True
    • image-20240510194018859

  • enqueue:

    • 默认为False,如果为True,则日志调用是异步的,并通过内部队列进行处理。这可以提高性能,特别是在高负载下。

    • logger.add("my_file_log.log", enqueue=True)
      
  • rotation:

    • 用于文件输出的日志轮转设置。可以基于文件大小(如 "5 MB")或时间间隔(如 "1 week")进行轮转。

    • logger.add("my_file_log.log", rotation="1 week")  # 每周轮转一次
      logger.add("my_file_log.log", rotation="5MB")  # 每到5MB就轮转一次
      
  • retention:

    • 指定日志文件的保留时长,超过这个时长的日志文件将被自动删除。

    • logger.add("my_file_log.log", retention="10 days")  # 保留10天的日志文件
      
  • compression:

    • 用于指定日志文件的压缩格式,如 "zip"

    • logger.add("my_file_log", compression="zip")
      
  • backtrace:

    • 默认为False,如果为True,则在记录错误级别的日志时自动添加回溯信息。

    • logger.add("with_backtrace.log", backtrace=True, level="ERROR")
      

(3)装饰器中的应用

  • 再装饰器可以使用记录日志功能,这样只使用了该装饰器,那么就可以自动记录日志

  • 示例

    • from loguru import logger
      from functools import wraps
      import time
      
      
      def timed_function(func):
          @wraps(func)
          def wrapper(*args, **kwargs):
              start_time = time.time()
              result = func(*args, **kwargs)
              end_time = time.time()
              duration = end_time - start_time
              logger.info(f"Function {func.__name__} took {duration:.2f}s to execute.")
              return result
      
          return wrapper
      
      
      @timed_function
      def add_func(x, y):
          import time
          time.sleep(1)
          return x + y
      
      
      add_func(1, 2)
      

【三】封装一个loguru

  • 目录结构:一般都是放在一个utils文件夹下
pythonProject # 项目文件
	-- utils  # 工具文件夹
		-- common_loguru 			# 自定义loguru工具包
			-- __init__.py 			# 初始化文件
	  		-- common_loguru.py 	# 主要逻辑py文件
			-- settings.py 			# 配置文件
	--test.py 						# 测试文件
  • _inti_.py文件
from .common_loguru import logger as common_loguru
  • common_loguru.py文件
import os
from pathlib import Path
from loguru import logger
# import settings
from . import settings
import sys


class LoguruConfigurator:
    def __init__(self):
        self._file_set = settings.LOGURU_FILE
        self._console_set = settings.LOGURU_CONSOLE

    def configure(self):
        # 清除所有现有的日志处理器(如果有的话)
        logger.remove()
        # 控制台输出
        if self._console_set.get('is_show', '').lower() == "on":
            level = self._console_set.get('level', 'INFO')
            logger.add(
                sink=sys.stderr,
                format="[<green>{time:YYYY-MM-DD HH:mm:ss}</green> {level:<8}| "
                       "<cyan>{module}</cyan>.<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
                       "<level>{message}</level>",
                level=level,
            )
            # 文件保存
        if self._file_set.get('is_show', '').lower() == "on":
            log_path = self._file_set.get('path', os.path.join(Path(__file__).parent.parent.parent, 'logs',
                                                               'test{time:YYYY-MM-DD}.log'))
            level = self._file_set.get('level', 'INFO')
            rotation = self._file_set.get('rotation', '10MB')
            retention = self._file_set.get('retention', '7 days')
            logger.add(
                log_path,
                rotation=rotation,
                retention=retention,
                compression='zip',
                encoding="utf-8",
                enqueue=True,
                format="[{time:YYYY-MM-DD HH:mm:ss} {level:<6} | {file}:{module}.{function}:{line}]  {message}",
                level=level,
            )


configurator = LoguruConfigurator()
configurator.configure()

if __name__ == '__main__':
    # 测试
    logger.info('这是一条info级别日志')
    logger.warning('这是一条warning级别日志')
    logger.error('这是一条error级别日志')
    logger.critical('这是一条critical级别日志')
    logger.debug('这是一条debug级别日志')

  • settings.py文件
import os
from pathlib import Path

LOGURU_FILE = {
    "is_show": "on",
    "level": "INFO",
    'path': os.path.join(Path(__file__).parent.parent.parent, 'logs', 'test{time:YYYY-MM-DD}.log'),
    "rotation": "10MB",
    'retention': "7 days",
}
LOGURU_CONSOLE = {
    "is_show": "on",
    "level": "INFO",
}
  • test.py文件
from utils.common_loguru import common_loguru

common_loguru.info('再次测试')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613233.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

flac和mp3的区别是什么?答案在这里

在数字音乐时代&#xff0c;音频格式的选择对于音质和文件大小的影响至关重要。FLAC和MP3是两种常见的音频格式&#xff0c;它们在音质和压缩方式上存在明显的差异。了解flac和mp3的区别&#xff0c;有助于我们在不同的场景下选择合适的音频格式&#xff0c;以获得最佳的音乐体…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…

使用 Express 框架构建的 Node.js web 应用程序

使用 Express 框架构建的 Node.js web 应用程序 ├── config │ └── config.js ├── middlewares │ └── errorHandler.js ├── routes │ ├── index.js │ ├── postRoutes.js │ └── userRoutes.js ├── .env ├── .gitignore ├── app.js ├…

【Centos7 】Centos7yum报错:another app is currently holding the yum lock;解决方案

Centos7 yum报错:another app is currently holding the yum lock;waiting for it to exit 大家好 我是寸铁&#x1f44a; 总结了一篇Centos7 yum报错:another app is currently holding the yum lock;waiting for it to exit✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 解…

【Linux系统编程】第十六弹---冯诺依曼体系结构与操作系统

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、冯诺依曼体系结构 2、操作系统原理 2.1、什么是操作系统&#xff1f; 2.2、用图解释操作系统 2.3、理解操作系统 总结 …

上班工资太低了,哪些副业可以多赚钱?

今天给各位分享最赚钱的副业方式的知识&#xff0c;其中也会对比较赚钱的副业进行解释. 1、网站接单 一般20页左右的PPT报价基本在200-400元。如果能每周接单&#xff0c;一个月就有接近1000元的副业收入。提交摄影和绘画作品 比起画画&#xff0c;靠摄影赚点外快更容易一点。…

11.买卖股票的最佳时机Ⅰ

文章目录 题目简介题目解答解法一&#xff1a;一次遍历代码&#xff1a;复杂度分析&#xff1a; 题目链接 大家好&#xff0c;我是晓星航。今天为大家带来的是 买卖股票的最佳时机面试题Ⅰ 相关的讲解&#xff01;&#x1f600; 题目简介 题目解答 解法一&#xff1a;一次遍历…

蓝桥杯成绩已出

蓝桥杯的成绩早就已经出来了&#xff0c;虽然没有十分惊艳 &#xff0c;但是对于最终的结果我是心满意足的&#xff0c;感谢各位的陪伴&#xff0c;关于蓝桥杯的刷题笔记我已经坚持更新了49篇&#xff0c;但是现在即将会告别一段落&#xff0c;人生即将进入下一个规划。我们一起…

代码随想录训练营Day28:贪心算法06

1.738单调递增的数字 贪心策略&#xff1a;如果strNum[i]<strNum[i-1]那么strNum[i] 9,strNum[i-1]--;//比如87对应的最大的单调递增的就是79. 具体实现&#xff1a; 对于遇到小于的情况&#xff1a;如果strNum[i]<strNum[i-1]那么strNum[i] 9,strNum[i-1]--;遍历顺…

学习Java的日子 Day44 初识前端

Day44 HTML 学习路线&#xff1a; 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1.B/S和C/S B/S&#xff1a;浏览器/服务器 教务系统 C/S&#xff1a;客户端/服务器 优缺点 1.开发/维护成本&#xff1a;B/S相对低 2.运算…

【江科大STM32学习笔记】新建工程

1.建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 2.工程文件夹里建立Start、Library、User等文件夹&#xff0c;复制固件库里面的文件到工程文件夹 为添加工程文件准备&#xff0c;建文件夹是因为文件比较多需要分类管理&#xff0c;需要用到的文件一定要复…

服务器2080ti驱动的卸载与安装

服务器2080ti驱动的卸载与安装 前言1、下载驱动2、驱动卸载与安装2.1 卸载原来驱动2.2 安装新驱动 3、查看安装情况 前言 安装transformers库&#xff0c;运行bert模型时出错&#xff0c;显示torch版本太低&#xff0c;要2.0以上的&#xff0c;所以更新显卡驱动&#xff0c;重…

爬虫学习:XPath提取网页数据

目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令&#xff1a;pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言&#xff0c;可以使用它在HTM…

百度公关一号位翻车的本质是,“精英主义”已经没有市场了 | 最新快讯

“精英主义”没市场了。 文&#xff5c;商隐社&#xff0c;作者 | 浩然 01 这几天商业圈持续发酵的热点新闻就是百度“公关一号位”璩静的“短视频翻车事件”。 一个名为“我是璩&#xff08;q&#xff09;静”&#xff0c;在自我介绍中标注了“百度副总裁”“公关一号位”“…

SpringAop详解

文章目录 一、Spring自定义注解1、什么是注解&#x1f468;‍&#x1f3eb;2、注解的目的或作用&#x1f49e;3、JDK内置注解&#x1f4ab; 【内置元注解 一共八个固定注解】4、元注解 &#x1f3af;5、自定义注解&#x1f4f8;5、Java反射API和类加载过程51、什么是反射基本原…

46 udp网络程序

查询网络服务的命令 netstat -nlup n: 显示数字 a&#xff1a;显示所有 u&#xff1a;udp服务 p&#xff1a;显示pid Recv-Q收到的数量&#xff0c;本地ip和远端ip&#xff0c;00表示可以收到任何地址 网络聊天 服务端 定义一个server类&#xff0c;成员保存ip地址&#xff…

Required:(String) → String Found:String

报错 Function invocation summaryFu(...) expected No value passed for parameter msg Type mismatch. Required: (String) → String Found: String class FunTest {/*参数包含函数的调用者* */fun funAndFunPropTest() { // 调用下面的test()//创建一个函数&#xff0…

Colab/PyTorch - 002 Pre Trained Models for Image Classification

Colab/PyTorch - 002 Pre Trained Models for Image Classification 1. 源由2. 图像分类的预训练模型3. 示例 - AlexNet/ResNet1013.1 模型推断过程3.2 使用TorchVision加载预训练网络3.3 使用AlexNet进行图像分类3.3.1 Step1&#xff1a;加载预训练模型3.3.2 Step2&#xff1a…

Redis 基础之常用数据类型及命令

常用数据类型及命令 String&#xff08;字符串&#xff09;Hash&#xff08;哈希&#xff09;List&#xff08;列表&#xff09;Set&#xff08;集合&#xff09;zset ( sorted set&#xff1a;有序集合 )Redis setbit 命令HyperLogLogs ( 基数统计 ) Redis 比 Memcached 更优秀…

HTTP 1.1 与 HTTP 1.0

什么是HTTP HTTP 就是一个 超文本传输协议 协议 : 双方 约定 发送的 域名 数据长度 连接(长连接还是短连接) 格式(UTF-8那些) 传输 :数据虽然是在 A 和 B 之间传输&#xff0c;但允许中间有中转或接力。 超文本:图片、视频、压缩包,在HTTP里都是文本 HTTP 常见状态码 比如 20…