当前位置: 首页 > article >正文

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

优点

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

效果


http://www.kler.cn/a/532685.html

相关文章:

  • Windows下怎么安装FFFmpeg呢?
  • 蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心
  • Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
  • 700. 二叉搜索树中的搜索
  • 基于Spring Security 6的OAuth2 系列之八 - 授权服务器--Spring Authrization Server的基本原理
  • 使用 PyTorch 实现逻辑回归并评估模型性能
  • 要将DsspSeek微调为行业专用的大模型,需要结合领域知识、数据优化和模型调整策略。
  • 【Linux系统】SIGCHLD 信号(选学了解)
  • 基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)
  • linux内核源代码中__init的作用?
  • 【仿12306项目】基于SpringCloud,使用Sentinal对抢票业务进行限流
  • Linux01——初识Linux
  • 【Python】NumPy(一):数据类型、创建数组及基本操作
  • Docker使用指南(二)——容器相关操作详解(实战案例教学,创建/使用/停止/删除)
  • 开发指南094-in语句的处理
  • Maven(Ⅱ):依赖范围,依赖传递,依赖阻断,可选依赖
  • 10分钟本地部署Deepseek-R1
  • Laravel Validation validated() 的实现
  • Selenium记录RPA初阶 - 基本输入元件
  • js --- 获取随机数
  • 预防和应对DDoS的方法
  • 【力扣】283.移动零
  • springboot后台系统开发(三)- 日志
  • 【OS】AUTOSAR架构下的Interrupt详解(上篇)
  • 某某音乐歌单下载(电脑)
  • 物联网领域的MQTT协议,优势和应用场景