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

优点

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

效果

相关推荐
蹦蹦跳跳真可爱58944 分钟前
Python----计算机视觉处理(Opencv:道路检测之提取车道线)
python·opencv·计算机视觉
Tanecious.3 小时前
机器视觉--python基础语法
开发语言·python
ALe要立志成为web糕手3 小时前
SESSION_UPLOAD_PROGRESS 的利用
python·web安全·网络安全·ctf
Tttian6224 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel
蹦蹦跳跳真可爱5895 小时前
Python----机器学习(KNN:使用数学方法实现KNN)
人工智能·python·机器学习
独好紫罗兰5 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
DREAM.ZL7 小时前
基于python的电影数据分析及可视化系统
开发语言·python·数据分析
Uncertainty!!7 小时前
python函数装饰器
开发语言·python·装饰器
吾日三省吾码8 小时前
Python 脚本:自动化你的日常任务
数据库·python·自动化
snowfoootball8 小时前
基于 Ollama DeepSeek、Dify RAG 和 Fay 框架的高考咨询 AI 交互系统项目方案
前端·人工智能·后端·python·深度学习·高考