[87.程序调试与测试(7):使用JSON文件进行日志配置] 零基础学python,简单粗暴

概述

  • 在的的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.csdn.net/pangzhaowen

概述

  • 在的的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"
    }
  },

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


猜你喜欢

转载自blog.csdn.net/pangzhaowen/article/details/80910362