python程序调试与测试使用JSON文件进行日志配置

本文介绍如何使用JSON配置文件来管理Python的日志记录设置,包括日志格式、文件存储位置、备份文件数量等,并提供了一个配置文件示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

  • 在的的Python代码中硬编码的日志记录的配置是很不灵活,也不便于管理的;
  • 记录配置的最好的方法是使用一个配置文件来管理;
  • Python 2.7及以后可以从字典中加载日志配置,也就意味着可以通过读取JSON文件来加载日志的配置;

配置文件范本

下面是一个JSON文件存储日志配置的范本,我们可以以此为蓝本,来修改不同记录对象的日志格式,文件存储位置,备份文件和存储上限,输出处理器等信息:(PS:这里注意使用时要删除中文注释,否则就不是一个标准的JSON文件) 

{
  "version": 1,
  "disable_existing_loggers": false,

  //  日志格式
  "formatters": {
    "simple": {
      "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    }
  },

  "handlers": {

    //      定义控制台日志的级别和样式
    "console": {
      "class": "logging.StreamHandler",
      "level": "DEBUG",
      "formatter": "simple",
      "stream": "ext://sys.stdout"
    },

    //        定义INFO(以上)级别的日志处理器
    "info_file_handler": {
      "class": "logging.handlers.RotatingFileHandler",
      "level": "INFO",
      "formatter": "simple",
      "filename": "./logs/info.log",
      "maxBytes": 10485760,
      "backupCount": 20,
      "encoding": "utf8"
    },

    //        定义ERROR以上)级别的日志处理器
    "error_file_handler": {
      "class": "logging.handlers.RotatingFileHandler",
      "level": "ERROR",
      "formatter": "simple",
      "filename": "./logs/errors.log",
      "maxBytes": 10485760,
      "backupCount": 20,
      "encoding": "utf8"
    }
  },

  //    定义不同name的logger的日志配置
  "loggers": {
    "mymodule": {
      "level": "ERROR",
      "handlers": [
        "info_file_handler"
      ],
      "propagate": "no"
    }
  },

  //    定义全局日志配置
  "root": {
    "level": "INFO",
    "handlers": [
      "console",
      "info_file_handler",
      "error_file_handler"
    ]
  }
}

读取JSON文件,加载全局日志配置

# 加载全局logging配置
# default_path 默认的JSON配置文件路径
# default_level 默认的日志级别
# env_key 通过读取系统环境变量来存储JSON配置文件的路径,名称是自定义的,前提是我们已经手动配置过这个环境变量
def setup_logging(default_path="logging.json", default_level=logging.INFO, env_key="LOG_CFG"):
    path = default_path

    # 尝试从环境变量读取日志配置
    value = os.getenv(env_key, None)
    if value:
        path = value
        print("从环境变量中获取到配置地址:",value)
    else:
        print("没有从环境变量中获取到配置地址")

    # 从json文件中加载日志配置
    if os.path.exists(path):
        with open(path, "r") as f:

            # 读取json文件为字典
            config = json.load(f)
            print(type(config))#<class 'dict'>

            # 使用字典进行全局日志配置
            logging.config.dictConfig(config)
    else:

        # 没有读到配置文件时胡乱配置一个
        logging.basicConfig(level=default_level)
# 读取json文件并进行全局日志配置
setup_logging(default_path="./configs/logging.json")

输出记录日志

logging.info("start func")
logging.info("exec func")
logging.info("end func")
logging.error("shit! a damn error occured!")

对照配置文​​件的相关片段:

  "root": {
    "level": "INFO",
    "handlers": [
      "console",
      "info_file_handler",
      "error_file_handler"
    ]
  }

实际的执行效果也是完全一致的:INFO及以上级别的日志被同时输出到文件和控制台,INFO以上级别的日志保存在./logs/info.log中,ERROR以上级别的日志保存在./logs /errors.log中,输出格式均为“%(asctime)s - %(name)s - %(levelname)s - %(message)s”:


输出记录日志

我们导入一个子模块,这个子模块中的记录对象以他妈的命名,令其进行一些输出:

import mymodule
mymodule.doSomeLog()

MyModule中的模块代码如下:

import logging
# logging.warning("!!!away from my wife,this is a warning!!!")
logger = logging.getLogger("fuck")

def doSomeLog():
    logger.info("!!!mymodule init ok!!!")
    logger.error("!!!mymodule a fucking error occured!!!")

查阅配置文件中的相关片段,我们知道名为他妈的的记录对象,会输出错误级别的日志到./logs/info.log中

  "loggers": {
    "fuck": {
      "level": "ERROR",
      "handlers": [
        "info_file_handler"
      ],
      "propagate": "no"
    }
  },

实际的执行效果也是完全一致的,信息级别的日志并没有被写入文件中,控制台也没有输出;

 

版权声明:本文为博主原创文章,未经博主允许不得转载.https://my.youkuaiyun.com/pangzhaowen

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值