动态获取脚本名称作为日志文件的名称

优点

  1. 独立性

    • 每个脚本的日志独立存储,避免日志混杂,便于排查问题。
  2. 灵活性

    • 支持动态获取脚本名称,无需手动指定日志记录器名称。
  3. 可扩展性

    • 可以轻松扩展日志格式、级别、存储路径等功能。
  4. 易用性

    • 只需导入 logger 即可使用,无需额外配置。

代码

复制代码
#!/usr/bin/python3
# -*- coding: UTF-8 -*-

import logging
import traceback
from logging.handlers import TimedRotatingFileHandler
import pathlib
from logging import Logger


def get_logger(name, level=logging.INFO):
    """
    构建一个 logger
    :param name: logger 唯一标识
    :param level: 日志等级
    :return:
    """

    # 创建一个 logger 对象
    _logger = Logger.manager.getLogger(name)
    _logger.setLevel(level)
    # 创建一个 handler 输出到控制台
    console_handler = logging.StreamHandler()
    formatter = logging.Formatter(
        "%(asctime)s - %(levelname)s - %(pathname)s:%(lineno)d - %(message)s",
    )
    console_handler.setFormatter(formatter)

    _logger.addHandler(console_handler)

    # 与logger.py相对路径相关
    path = pathlib.Path(__file__).parent.joinpath(f"./logs/{name}.log")
    path.parent.mkdir(parents=True, exist_ok=True)
    # 按天分割日志,最多7天
    file_handler = TimedRotatingFileHandler(
        str(path), when="midnight", interval=1, backupCount=7, encoding="utf8"
    )
    file_handler.setFormatter(formatter)
    _logger.addHandler(file_handler)
    _logger.info(f"日志文件路径:{path}")
    return _logger


def _get_server_name():
    """

    :return:
    """

    _server_name = "default"
    _stack = traceback.extract_stack()
    r = None

    for item in _stack[::-1]:
        if item.name == "_get_server_name":
            # 与logger.py相对路径相关
            r = pathlib.Path(item.filename).parent.as_posix().replace("\\", "/")

        filename = item.filename.replace("\\", "/")
        if r and r in filename:
            _server_name = pathlib.Path(filename).name.replace(".py", "")

    return _server_name


logger = get_logger(_get_server_name())

# 使用示例
if __name__ == "__main__":
    logger.info("测试日志")

效果

相关推荐
IVEN_18 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang19 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮19 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling19 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮1 天前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽1 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健2 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞2 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
曲幽2 天前
FastAPI压力测试实战:Locust模拟真实用户并发及优化建议
python·fastapi·web·locust·asyncio·test·uvicorn·workers