45

stdout への出力に「Print」を使用する Python スクリプトがあります。最近、Python Logger を介してログを追加しました。ログが有効になっている場合、これらの print ステートメントがロガーに送られるようにしたいと考えています。これらの印刷ステートメントを変更または削除したくありません。

「log.info("some info msg")」を実行してログに記録できます。私はこのようなことができるようにしたい:

if logging_enabled:
  sys.stdout=log.info
print("test")

ロギングが有効になっている場合、log.info("test") を行ったかのように "test" がログに記録されます。ロギングが有効になっていない場合は、「test」が画面に出力されるだけです。

これは可能ですか?同様の方法で stdout をファイルに送信できることはわかっています (参照:出力をログ ファイルにリダイレクトする) 。

4

7 に答える 7

37

次の 2 つのオプションがあります。

  1. ログファイルを開き、関数ではなく sys.stdout をそれに置き換えます。

    log = open("myprog.log", "a")
    sys.stdout = log
    
    >>> print("Hello")
    >>> # nothing is printed because it goes to the log file instead.
    
  2. print を log 関数に置き換えます。

    # If you're using python 2.x, uncomment the next line
    #from __future__ import print_function
    print = log.info
    
    >>> print("Hello!")
    >>> # nothing is printed because log.info is called instead of print
    
于 2012-06-20T16:44:20.227 に答える
22

もちろん、次のように、標準出力に出力してログ ファイルに追加することもできます。

# Uncomment the line below for python 2.x
#from __future__ import print_function

import logging

logging.basicConfig(level=logging.INFO, format='%(message)s')
logger = logging.getLogger()
logger.addHandler(logging.FileHandler('test.log', 'a'))
print = logger.info

print('yo!')
于 2013-07-16T16:52:07.890 に答える
13

はるかに単純なオプション、

import logging, sys
logging.basicConfig(filename='path/to/logfile', level=logging.DEBUG)
logger = logging.getLogger()
sys.stderr.write = logger.error
sys.stdout.write = logger.info
于 2017-10-27T18:29:58.120 に答える
2

print設定に応じて、ステートメントまたは何か他のものを使用するようにロギング構成を調整することにより、実際には別の方法で行う必要があります。動作を上書きしないでくださいprint。将来導入される可能性のある設定の一部 (たとえば、あなたまたはあなたのモジュールを使用する他の人によって) が実際に に出力される可能性がstdoutあり、問題が発生する可能性があります。

stdoutログ メッセージを適切なストリーム (ファイル、またはその他のファイルのようなもの)にリダイレクトするハンドラーがあります。と呼ばれてモジュールStreamHandlerに同梱されていloggingます。

したがって、基本的に私の意見では、やりたくないと言ったことを行う必要がありますprint。ステートメントを実際のログに置き換えます。

于 2012-06-20T16:54:58.097 に答える