我是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.
我知道有关此网站上有类似问题的帖子,但我没有针对这个问题的解决方法/解决方案,可以在这种情况下使用。
答案 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
之类的内容