为某些消息禁用格式

问题描述:

我正在开发数据分析管道的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)

+0

这工作得很好!谢谢。 – mbiokyle

您可以为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:我以前的回答是关于获取回调,对不起。