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

优点

  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("测试日志")

效果

相关推荐
闻道且行之4 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
许彰午5 小时前
95_Python内存管理与垃圾回收
开发语言·python
骄阳如火6 小时前
Python 性能深度剖析:从“被诟病的慢”到“Rust 重塑”的拐点
python
满怀冰雪6 小时前
03-第一个 Paddle 程序:Tensor 创建、计算与设备管理
人工智能·python·paddle
CClaris7 小时前
大模型量化从0到1(九):用 llama.cpp 把模型转成 GGUF 并跑本地推理
人工智能·pytorch·python·深度学习·llama
学编程的小虎7 小时前
SenseVoice微调
人工智能·python·自然语言处理
诸葛说抛光7 小时前
国内大型汽车改装展览会定展 佛山改装 佛山汽车赛事
python·汽车
chouchuang7 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
乖巧的妹子8 小时前
Python基础核心知识点详解:内置函数、运算符、字符串方法、数据结构与类型转换
python
幸福清风8 小时前
Python 完美处理Excel合并单元格:拆分填充+自动合并
python·excel·合并单元格·拆分单元格