0

私はパイソン初心者です。私の 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.

このサイトで同様の質問を提案する投稿があったことは知っていますが、このシナリオで機能するこの問題の回避策/解決策はありません。

4

1 に答える 1

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

于 2012-08-24T17:33:39.077 に答える