您的位置:首页 > 编程语言 > Python开发

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

2018-07-04 11:56 423 查看

概述

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

配置文件范本

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

[code]{
"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文件,加载全局日志配置

[code]# 加载全局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)
[code]# 读取json文件并进行全局日志配置
setup_logging(default_path="./configs/logging.json")

输出记录日志

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

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

[code]  "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”:

输出记录日志

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

[code]import mymodule
mymodule.doSomeLog()

MyModule中的模块代码如下:

[code]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中

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

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

 

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

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐