HiveNetCore.utils.debug_tool 源代码
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#
# Copyright 2018 黎慧剑
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
通用调试工具
@module debug_tool
@file debug_tool.py
"""
import sys
import os
import json
import logging
import logging.config
# 根据当前文件路径将包路径纳入, 在非安装的情况下可以引用到
sys.path.append(os.path.abspath(os.path.join(
os.path.dirname(__file__), os.path.pardir, os.path.pardir)))
from HiveNetCore.utils.run_tool import RunTool
from HiveNetCore.utils.string_tool import StringTool
__MOUDLE__ = 'debug_tool' # 模块名
__DESCRIPT__ = u'通用调试工具' # 模块描述
__VERSION__ = '0.1.0' # 版本
__AUTHOR__ = u'黎慧剑' # 作者
__PUBLISH__ = '2018.08.29' # 发布日期
[文档]class DebugTool(object):
"""
通用调试类, 用于输出各类调试信息
@example
1、在主程序的入口设置启动调试
DebugTools.set_debug(True)
2、在需要输出调试的地方, 传入要输出的变量
DebugTools.debug_print(abc,10,'ddf',{'a':33,'b':'33'},name=NullObj(),cb=CResult())
"""
[文档] @staticmethod
def set_debug(set_on=True):
"""
启动/关闭debug的输出
@param {bool} set_on - 是否启动调试
"""
DEBUG_TOOLS_SWITCH_ON = RunTool.get_global_var('DEBUG_TOOLS_SWITCH_ON')
if DEBUG_TOOLS_SWITCH_ON is None:
DEBUG_TOOLS_SWITCH_ON = False
RunTool.set_global_var('DEBUG_TOOLS_SWITCH_ON', False)
DEBUG_TOOLS_LOGGER = RunTool.get_global_var('DEBUG_TOOLS_LOGGER')
if set_on:
if not DEBUG_TOOLS_SWITCH_ON:
# 创建输出日志类
if DEBUG_TOOLS_LOGGER is None:
DebugTool.__create_logger()
RunTool.set_global_var('DEBUG_TOOLS_SWITCH_ON', True)
else:
if DEBUG_TOOLS_SWITCH_ON:
RunTool.set_global_var('DEBUG_TOOLS_SWITCH_ON', False)
[文档] @staticmethod
def is_debug_on() -> bool:
"""
判断当前debug状态是否启动
@returns {bool} - debug状态是否启动
"""
DEBUG_TOOLS_SWITCH_ON = RunTool.get_global_var('DEBUG_TOOLS_SWITCH_ON')
if DEBUG_TOOLS_SWITCH_ON is None:
DEBUG_TOOLS_SWITCH_ON = False
return DEBUG_TOOLS_SWITCH_ON
[文档] @staticmethod
def debug_print(*args, **kwargs):
"""
打印调试信息, 可打印传入的多个对象
"""
DEBUG_TOOLS_SWITCH_ON = RunTool.get_global_var('DEBUG_TOOLS_SWITCH_ON')
if DEBUG_TOOLS_SWITCH_ON is None:
DEBUG_TOOLS_SWITCH_ON = False
DEBUG_TOOLS_LOGGER = RunTool.get_global_var('DEBUG_TOOLS_LOGGER')
if not DEBUG_TOOLS_SWITCH_ON:
# 未启动调试
return
# 输出打印信息, 先准备整体信息
_print_info = u'[%s][%s][行:%s]DEBUG INFO:\n%s' % (
os.path.split(
os.path.realpath(
sys._getframe().f_back.f_code.co_filename)
)[1],
sys._getframe().f_back.f_code.co_name,
sys._getframe().f_back.f_lineno,
'\n'.join(DebugTool.__get_print_str_seq(args, kwargs))
)
DEBUG_TOOLS_LOGGER.debug(_print_info)
@staticmethod
def __create_logger():
"""
创建logger日志类
内部函数, 创建debug日志类
"""
DEBUG_TOOLS_LOGGER = RunTool.get_global_var('DEBUG_TOOLS_LOGGER')
if DEBUG_TOOLS_LOGGER is None:
DEBUG_TOOLS_JSON_PARA = u'''{
"version": 1,
"disable_existing_loggers": false,
"formatters": {
"DebugToolsFormatter": {
"format": "[%(asctime)s][PID:%(process)d][TID:%(thread)d]%(message)s"
}
},
"handlers": {
"DebugToolsConsoleHandler": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "DebugToolsFormatter",
"stream": "ext://sys.stdout"
}
},
"loggers": {
"DebugToolsConsole": {
"level": "DEBUG",
"handlers": ["DebugToolsConsoleHandler"]
}
},
"root": {
"level": "DEBUG",
"handlers": []
}
}
'''
_json_config = json.loads(DEBUG_TOOLS_JSON_PARA)
logging.config.dictConfig(_json_config)
DEBUG_TOOLS_LOGGER = logging.getLogger('DebugToolsConsole')
RunTool.set_global_var('DEBUG_TOOLS_LOGGER', DEBUG_TOOLS_LOGGER)
@staticmethod
def __get_print_str(var_obj):
"""
获取对象的打印字符串
@param {object} var_obj - 要打印的对象
@returns {string} - 打印的字符串
"""
_print_str = '[type=%s]%s%s' % (
str(type(var_obj)),
('' if not hasattr(var_obj, '__str__') else str(var_obj)),
('' if not hasattr(var_obj, '__dict__')
else StringTool.format_obj_property_str(var_obj, is_deal_subobj=True, c_level=2))
)
return _print_str
@staticmethod
def __get_print_str_seq(args, kwargs):
"""
返回对象清单打印序列, 利用yield逐个输出
@param {truple} args - 要打印的对象数组
@param {dict} kwargs - keyvalue的对象字典
@returns {iterable} - 每次迭代返回一个打印值
"""
for _obj in args:
yield '%s[key=]%s' % (
' ',
DebugTool.__get_print_str(_obj)
)
for _key in kwargs:
yield '%s[key=%s]%s' % (
' ',
_key,
DebugTool.__get_print_str(kwargs[_key])
)
return
if __name__ == '__main__':
# 当程序自己独立运行时执行的操作
# 打印版本信息
print(('模块名: %s - %s\n'
'作者: %s\n'
'发布日期: %s\n'
'版本: %s' % (__MOUDLE__, __DESCRIPT__, __AUTHOR__, __PUBLISH__, __VERSION__)))