Python自定义logger模块(附Demo)

1. 内置logger

Python标准库中的logging模块提供了日志记录的功能

允许开发者通过创建日志记录器、处理程序和格式化器来控制日志的生成和输出

以下是logging模块的一些主要组件和概念:

  • 日志记录器 (Logger):整个日志系统的主要入口点
    每个日志记录操作都通过一个特定的日志记录器来执行。通常,每个模块或子系统都会创建自己的日志记录器
    使用logging.getLogger(name)方法来获取或创建一个日志记录器,其中name参数是日志记录器的名称。如果省略name参数,则返回根日志记录器
  • 处理程序 (Handler)
    负责将日志记录发送到指定的目标,比如控制台、文件、网络等
    通过logging.StreamHandlerlogging.FileHandler等类来创建不同类型的处理程序
  • 格式化器 (Formatter):定义了日志消息的外观
    通过指定格式字符串来自定义日志消息的格式 或者 使用logging.Formatter类创建格式化器
  • 日志级别 (Log Level)
    日志级别用于表示日志消息的重要性或严重程度,按严重程度从低到高排序:DEBUG、INFO、WARNING、ERROR、CRITICAL
    日志记录器和处理程序可以设置最小日志级别,只有达到或超过该级别的日志消息才会被处理
import logging

# 创建日志记录器
logger = logging.getLogger('码农研究僧')
logger.setLevel(logging.DEBUG)

# 创建处理程序并设置级别
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 创建格式化器
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)

# 将处理程序添加到日志记录器
logger.addHandler(console_handler)

# 记录日志
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

截图如下:

在这里插入图片描述

如果日志记录器设置的登记为WARNING

# 创建日志记录器
logger = logging.getLogger('码农研究僧')
logger.setLevel(logging.WARNING)

则输出结果如下:

在这里插入图片描述

2. 自定义logger

自定义 Logger 可以根据项目的需求定制化日志记录,满足特定的日志记录格式、输出目标和日志级别等要求

通过自定义 Logger,可以实现以下功能:

  • 定制化日志格式:可以根据需求定义日志的格式,包括时间、模块、级别、消息等信息
  • 输出到不同的目标:可以将日志记录到控制台、文件、数据库、网络等不同的目标,方便日志的查看和管理
  • 灵活设置日志级别:可以根据项目的需要设置不同级别的日志记录,满足不同的调试和排错需求
  • 增加额外的功能:可以扩展 Logger 的功能,如添加日志的归档、压缩、加密等功能

可以整个拷贝的logger模块:

from datetime import datetime
from os import path
from sys import stdout

from loguru import logger


class MyLogger(object):
    def __init__(self, log_name, level="INFO") -> logger:
        logger.remove()
        fmt = '<level>{time:YYYY-MM-DD HH:mm:ss} | {module}: {level} >> {message}</level>'
        logger.add(stdout, format=fmt)
        self.my_logger = logger
        _today = datetime.today().strftime("%Y_%m_%d")
        log_path = f"{log_name}{_today}.log"
        self.name = path.basename(log_path)
        self.my_logger.add(
            log_path, encoding="utf-8", retention='7 days', rotation="50 MB", compression='zip', format=fmt,
            enqueue=True, level=level)

    def info(self, content):
        self.my_logger.opt(depth=1).info(content)

    def debug(self, content):
        self.my_logger.opt(depth=1).debug(content)

    def error(self, content, *args, **kwargs):
        self.my_logger.opt(depth=1).error(content)
        if len(args) > 0 or len(kwargs) > 0:
            self.exception("Error details:", *args, **kwargs)

    def exception(self, content, *args, **kwargs):
        self.my_logger.opt(depth=1).exception(content, *args, **kwargs)

    def warning(self, content):
        self.my_logger.opt(depth=1).warning(content)

测试如下:


# 创建一个名为 "my_app" 的日志记录器,级别为 INFO
logger = MyLogger("my_app")

# 记录一条 INFO 级别的日志
logger.info("This is an informational message.")

# 记录一条 DEBUG 级别的日志
logger.debug("This is a debug message.")

# 记录一条 ERROR 级别的日志
logger.error("This is an error message.")

# 记录一条 WARNING 级别的日志
logger.warning("This is a warning message.")

# 记录一条 ERROR 级别的日志,并附带额外的参数和关键字参数
logger.error("An error occurred.", "Extra info", custom_param="Custom value")

# 记录一条 ERROR 级别的日志,同时记录异常信息
try:
    result = 1 / 0
except Exception as e:
    logger.exception("An error occurred while performing a calculation.")

截图如下:

在这里插入图片描述

整体logger文件如下:

在这里插入图片描述

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值