loguru -- 高等级封装的日志模块

1. 安装loguru

我们可以直接使用pip命令对其进行安装

	pip install loguru

2. loguru简单使用

from loguru import logger
 
logger.info("中文loguru")
logger.debug("中文loguru")
logger.error("中文loguru")
logger.warning("中文loguru")

# 运行结果

2020-03-07 15:51:05.752 | INFO | main:info:23 - 中文loguru
2020-03-07 15:51:05.753 | DEBUG | main:debug:26 - 中文loguru
2020-03-07 15:51:05.753 | WARNING | main: warning:29 - 中文loguru
2020-03-07 15:51:05.753 | ERROR | main:error:32 - 中文loguru

可以看到其默认的输出格式是包含【时间、级别、模块名、行号以及日志信息】,不需要手动创建 logger ,直接使用即可,另外其输出还是彩色的,看起来会更加友好。

3. loguru保留日志文件

一般情况,我们都需要将日志输出保存到文件中,loguru直接通过 add() 方法,就可以配置一个日志文件,如下代码所示:

# coding:utf-8
from loguru import logger

logger.add(
"interface_log_{time}.log",
# format="{time} {level} {message}",
# filter="my_module",
# level="INFO",
rotation="500MB",
encoding="utf-8",
enqueue=True,
compression="zip",
retention="10 days"
)
logger.info("中文test")
logger.debug("中文test")
logger.error("中文test")
logger.warning("中文test")

# 然后就去interface_log_2020-03-07-15:55.log查看日志
在这里插入图片描述

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

# 包含知识点

  • 第一个参数是保存日志信息的文件路径,像我写的后缀多了个 {time} ,就是获取当前时间节点,这样就会自动创建新的日志;这个time应该是库里自带的变量,如果你想自己定义time也可以的哦,具体可以看看下面封装类的实现形式!

  • 当你需要输出中文日志的时候,请加上 encoding=“utf-8” ,避免出现乱码

  • enqueue=True 代表异步写入,官方的大概意思是:在多进程同时往日志文件写日志的时候使用队列达到异步功效

  • rotation 可以理解成日志的创建时机,可以有多种写法 ◦rotation=“500 MB” :当日志文件达到500MB时就会重新生成一个文件

  • rotation=“12:00” :每天12点就会创建新的文件、

  • rotation=“1 week” :每隔一周创建一个log

  • retention 配置日志的最长保留时间,官方例子: “1 week, 3 days”、“2 months”

  • compression 配置文件的压缩格式,可以配置常见的格式 zip、tar、gz、tar.gz 等

4. loguru封装类,可以直接拿去用!

日志输出路径:你的项目路径下的log文件夹下

注意:这个是工具类,需要放在项目路径下的util文件夹之类的,不能直接放项目路径下哈,不然路径会生成错误哦

"""
loguru 封装类,导入即可直接使用
# 当前文件名 logger.py
"""

from functools import wraps
import sys
import datetime
import loguru
from pathlib import Path
import os
import configparser

# 单例类的装饰器
def singleton_class_decorator(cls):
    """
    装饰器,单例类的装饰器
    """
    # 在装饰器里定义一个字典,用来存放类的实例。
    _instance = {}

    # 装饰器,被装饰的类
    @wraps(cls)
    def wrapper_class(*args, **kwargs):
        # 判断,类实例不在类实例的字典里,就重新创建类实例
        if cls not in _instance:
            # 将新创建的类实例,存入到实例字典中
            _instance[cls] = cls(*args, **kwargs)
        # 如果实例字典中,存在类实例,直接取出返回类实例
        return _instance[cls]

    # 返回,装饰器中,被装饰的类函数
    return wrapper_class


@singleton_class_decorator
class Logger:
    def __init__(self):
        self.logger_add()

    def read_ini(self):
        config = configparser.ConfigParser(inline_comment_prefixes=('#', ';')) # 添加可以读取行内注释的参数
        config.read(Path(Path(__file__).parent, 'log.ini'), encoding="UTF-8")
        return config

    def get_project_path(self, project_path=None):
        if project_path is None:
            # 当前项目文件的,绝对真实路径
            # 路径,一个点代表当前目录,两个点代表当前目录的上级目录
            project_path = Path(__file__).parent.parent
        # 返回当前项目路径
        return project_path

    def get_log_path(self):
        # 项目目录
        project_path = self.get_project_path()
        # 项目日志目录
        project_log_dir = Path(project_path, 'Logs')
        # 日志文件名
        project_log_filename = '{}.log'.format(datetime.date.today())
        # 日志文件路径
        project_log_path = Path(project_log_dir, project_log_filename)

        return project_log_path

    def logger_add(self):
        # 清空所有设置
        loguru.logger.remove()

        # 读取配置
        config = self.read_ini()

        # 控制台输出
        if config.get('StderrLog', 'is_open').lower() == "on":
            loguru.logger.add(
                # 控制台打印
                sys.stderr,
                format="[<green>{time:YYYY-MM-DD HH:mm:ss}</green> {level:<8}| "  # 颜色>时间
                                #    "{process.name} | "  # 进程名
                                #    "{thread.name} | "  # 进程名
                                "<cyan>{module}</cyan>.<cyan>{function}</cyan>"  # 模块名.方法名
                                ":<cyan>{line}</cyan> | "  # 行号
                                "<level>{message}</level>",  # 日志内容
                level=config.get('StderrLog', 'level'),
            )

        # 文件保存
        if config.get('FileLog', 'is_open').lower() == "on":
            project_log_path= self.get_log_path(),
            # 返回日志路径
            if not os.path.exists(project_log_path):
                os.mkdirs(project_log_path)

            loguru.logger.add(
                # 保存的路径
                sink=project_log_path,
                # 日志创建周期
                rotation=config.get('FileLog', 'rotation'),
                # 保存
                retention=config.get('FileLog', 'retention'),
                # 文件的压缩格式
                compression='zip',
                # 编码格式
                encoding="utf-8",
                # 支持异步存储
                enqueue=True,
				# 输出格式
                format="[{time:YYYY-MM-DD HH:mm:ss} {level:<8} | {file}:{module}.{function}:{line}]  {message}",
                level=config.get('FileLog', 'level'),
            )

    @property
    def get_logger(self):
        return loguru.logger


'''
# 实例化日志类
'''
logger = Logger().get_logger


if __name__ == '__main__':
    logger.debug('调试代码')
    logger.info('输出信息')
    logger.success('输出成功')
    logger.warning('错误警告')
    logger.error('代码错误')
    logger.critical('崩溃输出')
    logger.exception('log 异常')

    """
    在其他.py文件中,只需要直接导入已经实例化的logger类即可
    例如导入访视如下:
    from project.logger import logger
    然后直接使用logger即可
    """
    logger.info('----原始测试----')


log.ini配置

# 文件log的配置
[FileLog]
is_open = off  # on打开, off关闭
level = INFO  # 打印什么级别的日志
rotation = 10MB
retention = 7 days

# 控制台log的配置
[StderrLog]
is_open = on
level = INFO  # 打印什么级别的日志
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: XH-2.54-W-3P封装是一种电气连接器封装类型。XH代表该封装符合XH系列标准,该系列标准适用于电子设备中的电气连接。2.54表示该封装的引脚间距为2.54毫米,是一种常见的间距尺寸,可以满足一般电路板的设计需求。W代表该封装是扁平式封装,也就是引脚是以扁平的形式布置在封装底部。3P代表该封装有3个引脚,也就是适用于需要3个电气连接的设备。 XH-2.54-W-3P封装具有一些优点。首先,它具有标准化的封装规格,可以更好地与其他电子元器件进行匹配和组装。其次,2.54毫米的引脚间距适用于多种封装需求,方便制造和维修。再次,扁平式布置的引脚使得连接器能够更好地适应电路板的设计要求,同时也方便与其他设备进行连接。最后,3个引脚的设计使得该封装可以满足需要3个电气连接的设备的需求。 总之,XH-2.54-W-3P封装是一种常见的电气连接器封装,它具有标准化规格、适用性广泛以及方便连接等优点,适用于需要3个电气连接的设备。 ### 回答2: xh-2.54-w-3p封装是一种电子元件的封装方式。它的封装尺寸为2.54毫米,具有3个引脚(pin)。xh-2.54-w-3p封装通常用于连接不同电子元件之间的电路,以实现信号的传输和控制。这种封装方式在电子行业中广泛应用,例如电子设备制造、电路板组装等。xh-2.54-w-3p封装具有良好的可靠性和稳定性,能够确保电子元件在不同环境下的正常工作。它的设计使得元件的引脚与电路板的焊盘之间能够精确地连接,从而实现电路的稳定性和可靠性。在实际应用中,我们可以根据需要选择不同的尺寸和引脚数量的封装方式,以满足不同的电路需求。总之,xh-2.54-w-3p封装是一种常见的电子元件封装方式,它在电子行业中扮演着重要的角色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值