1. 内置logger
Python标准库中的logging模块提供了日志记录的功能
允许开发者通过创建日志记录器、处理程序和格式化器来控制日志的生成和输出
以下是logging模块的一些主要组件和概念:
- 日志记录器 (Logger):整个日志系统的主要入口点
每个日志记录操作都通过一个特定的日志记录器来执行。通常,每个模块或子系统都会创建自己的日志记录器
使用logging.getLogger(name)
方法来获取或创建一个日志记录器,其中name参数是日志记录器的名称。如果省略name参数,则返回根日志记录器 - 处理程序 (Handler):
负责将日志记录发送到指定的目标,比如控制台、文件、网络等
通过logging.StreamHandler
、logging.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文件如下: