【发布时间】:2014-01-09 11:25:32
【问题描述】:
让我们简化一下。我的目标是使用 Python 中的 logging 模块在终端中进行颜色输出。我希望信息有一个绿色前缀,警告有一个黄色前缀,错误有一个红色前缀。为了简单起见,让我们使用*** 作为前缀,即
*** log text
*** another message with another prefix color
到目前为止我做了什么
# declaration of function (global scope)
log = None
warn = None
error = None
def build_log_funcs():
# why I initialize it inside the function ?
# because script doesnt have to know about logging method
# the function just provide log functions
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
sh = logging.StreamHandler()
# LOG_FORMAT just global variable with pattern including %(levelmarks)s
# it will be replaced with ** with proper color
formatter = logging.Formatter(LOG_FORMAT)
sh.setFormatter(formatter)
logger.addHandler(sh)
def make_log_func(func, color, is_exit = False):
color_string = "\x1b[{};1m***\x1b[0m".format(color)
def newfunc(*args, **kwargs):
func(*args, extra={'levelmarks':color_string}, **kwargs)
if is_exit:
sys.exit(-1)
return newfunc
# 32, 33, 31 are color codes
log = make_log_func(logger.info, 32)
warn = make_log_func(logger.warning, 33)
error = make_log_func(logger.error, 31, is_exit = True)
return log, warn, error
并将其用作
log, warn, error = build_log_funcs()
它有效,但我不喜欢:(从小到大的问题)
- 我隐藏了
logging模块的功能。例如启用/禁用调试消息 - 我应该在函数初始化之前使用函数的全局声明,因为我不能在函数声明之前调用函数。
- 阅读和维护代码太难了。我相信一切都应该尽可能简单。
我为什么不做简单的日志,警告,简单的功能?我不知道。 logging 是一个非常全面的模块,所以我将来可能需要它的功能。
我的问题是你将如何解决这个问题?可能有一个我不知道的简单明显的方法。
【问题讨论】: