为某些消息禁用格式
问题描述:
我正在开发数据分析管道的pythons日志库。我正在记录有关正在运行哪些步骤的自定义消息以及被调用程序的原始输出。我正在使用sh.py
来简化shell命令的调用。它让我定义一个回调函数来处理每行STDOUT/STDERR
。为某些消息禁用格式
我想能够定义我的回调函数,以每一行记录到日志文件与各种格式化(这些程序输出很多线路):
log.info("Starting %s run on %s", program_name, file_name)
def call_back(line):
log.info.NOFORMAT(line) # do the no format logging
sh.program(args, _out=call_back)
log.info("Finished running %s", program_name)
我生成的日志文件将然后看起来像:
"""<br>
2016-01-22|{INFO}: Starting $SOME_PROGRAM$ on $SOME_FILE$<br>
program_output_line<br>
program_output_line<br>
program_output_line<br>
program_output_line<br>
program_output_line<br>
2016-01-22|{INFO}: Finished running $SOME_PROGRAM$<br>
"""
有谁知道我该怎么做到这一点?
答
你可以看看logging.config https://docs.python.org/2/library/logging.config.html
基本上,你需要定义一个专门的记录写入到同一个文件作为根记录器,但采用的是精简格式,像format=%(message)s
。在call_back中,您将明确地获取该记录器:logging.getlogger(logger_name)
。
答
您可以为Logger
将使用的处理程序设置一个logging.Formatter
对象。它应该实现format(record)
方法,该方法将返回将实际显示的字符串。
import sh
import logging
class MyFormatter(logging.Formatter):
def __init__(self, *args, **kwargs):
logging.Formatter.__init__(self, *args, **kwargs)
self._enableFormatFlag = True
def enableFormat(self):
self._enableFormatFlag = True
def disableFormat(self):
self._enableFormatFlag = False
def format(self, record):
if self._enableFormatFlag:
return logging.Formatter.format(self, record)
else:
return record.getMessage()
logger = logging.getLogger('myapp')
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
logger.addHandler(handler)
formatter = MyFormatter(fmt="prefix[%(message)s]suffix")
handler.setFormatter(formatter)
def callback(line):
logger.info(line.strip())
logger.info("Will start program")
formatter.disableFormat()
sh.ls(['-l'],_out=callback)
formatter.enableFormat()
logger.info("Finished program")
PS:我以前的回答是关于获取回调,对不起。
这工作得很好!谢谢。 – mbiokyle