python:将外部API的输出记录到记录器模块

时间:2012-08-24 17:31:11

标签: python logging stdout

我是python初学者。我的python脚本使用基本的python日志记录模块将输出记录到文件(例如example.log)。但是,我的python脚本也进行了一些第三方API调用(例如,parse_the_file),我没有任何控制权。我想将API生成的输出(通常在控制台上)捕获到我的example.log中。以下示例代码部分工作,但问题是,一旦我开始将API的输出记录到我的日志文件中,内容就会被覆盖。

#!/usr/bin/env python

import logging
import sys
import os
from common_lib import *     # import additional modules

logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

logging.debug('This is a log message.') # message goes to log file.

sys.stdout = open('example.log','a')
metadata_func=parse_the_file('/opt/metadata.txt') # output goes to log file but OVERWRITES the content
sys.stdout = sys.__stdout__
logging.debug('This is a second log message.') # message goes to log file.

我知道有关此网站上有类似问题的帖子,但我没有针对这个问题的解决方法/解决方案,可以在这种情况下使用。

1 个答案:

答案 0 :(得分:1)

尝试:

log_file = open('example.log', 'a')
logging.basicConfig(stream=log_file, level=logging.DEBUG)
logging.debug("Test")
sys.stdout = log_file
sys.stderr = log_file
stdout_fd = os.dup(1)
stderr_fd = os.dup(2)
os.dup2(log_file.fileno(), 1)
os.dup2(log_file.fileno(), 2)

os.system("echo foo")

os.dup2(stdout_fd, 1)
os.dup2(stderr_fd, 2)
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__

但是,这不会相应地格式化。如果您需要,可以尝试http://plumberjack.blogspot.com/2009/09/how-to-treat-logger-like-output-stream.html

之类的内容