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

优点

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

效果

相关推荐
打工仔折腾 AI8 分钟前
Prometheus 告警推钉钉:从单群 Webhook 到跨网络 Alertmanager 实战
人工智能·后端·python·性能优化
Ivanqhz13 分钟前
Ping-Pong 双缓冲
开发语言·人工智能·python·深度学习·mlir
三十岁老牛再出发13 分钟前
9月18日总结
python·深度学习·机器学习
就叫你天选之人啦25 分钟前
安装torch+vllm+flash_attn的prompt
人工智能·pytorch·python
wuyk5551 小时前
21.计数排序:不用比较的“空间换时间”排序算法
python·算法·排序算法
智码看视界1 小时前
第4篇:循环神经网络及其变体 LSTM/GRU 实战
python·自然语言处理·gru·lstm·循环神经网络·情感分析·梯度消失
Web3&Basketball1 小时前
Agent外传审计实战:3类失准事故拦截脚本
python·大模型·agent·性能调优·推理优化
何以解忧,唯有..1 小时前
Milvus 向量数据库的 DDL、DML、DQL 操作详解
python
罗狮粉 991 小时前
AI-Gateway — 面向 AI Agent 的本地 Runtime Gateway
人工智能·python·inscode·ai编程
蓝胖的四次元口袋1 小时前
Python数据结构知识梳理
python