Python日志记录模块输出到屏幕滞后

时间:2013-11-25 17:36:03

标签: python logging stdout

在我的python脚本中,我使用带有INFO的日志模块转到文件和屏幕:

fh_info = logging.FileHandler(info)
fh_info.setLevel(logging.INFO)
fh_info.setFormatter(formatter)

std_out_info = logging.StreamHandler()
std_out_info.setLevel(logging.INFO)

logger.addHandler(fh_info)
logger.addHandler(std_out_info)

但我遇到的问题是在功能完成后消息进入屏幕。例如,在:

def getToken(self):
    msg = ("Initializing token....")
    logger.info(msg)
    sys.stdout.flush()
    try:
        jsonreq = ( {"auth": {"KEY:apiKeyCredentials": {
            "username": self.username,
            "apiKey": self.apikey}}})
        auth_headers = {'content-type': 'application/json'}
        r = requests.post(self.url, data=json.dumps(jsonreq), headers=auth_headers)
        self.jsonresp = json.loads(r.text)
        self.token = str(self.jsonresp['access']['token']['id'])
        msg = ("done!")
        logger.info(msg)
    except:
        msg = ("Bad name or apikey!")
        logger.error(msg)
        sys.exit()

在功能中的操作完成后,消息“正在初始化令牌....”将进入屏幕。在身份验证正在进行而没有输出的情况下进行长时间暂停...然后在身份验证完成后,我看到“正在初始化令牌....已完成”。

如何使logger.info(msg)与脚本流保持同步并及时输出到屏幕?

1 个答案:

答案 0 :(得分:2)

您没有使用StreamHandler初始化sys.stdout,因此它将使用记录的默认值 - sys.stderr。这就是为什么你对sys.stdout的刷新没有任何影响 - 你发布的代码没有引起sys.stdout的写入!