私はprintステートメントでプロジェクトに多くのコードを書いていて、これらのprintステートメントの素早い汚れたロガーを作ってカスタムルートを作ることに決めました。私はターミナルとファイルの両方に(このサイトの助けを借りて)プリントするロガーをまとめましたが、今はそれぞれのステートメントに単純なタイムスタンプを追加したいと思い、奇妙な問題にぶつかっています。タイムスタンプの付いたカスタムロガー
ここに私のロギングクラスがあります。
class Logger(object):
def __init__(self, stream):
self.terminal = stream
self.log = open("test.log", 'a')
def write(self, message):
self.terminal.flush()
self.terminal.write(self.stamp() + message)
self.log.write(self.stamp() + message)
def stamp(self):
d = datetime.today()
string = d.strftime("[%H:%M:%S] ")
return string
私が書き込みメソッドで使用しようとしているスタンプ方法に注目してください。
私は予期しない出力を得る次の2行で実行:
sys.stdout = Logger(sys.stdout)
print("Hello World!")
を出力:
[11:10:47] Hello World![11:10:47]
この出力はまたしかし、ログファイルに見えるもの、私はない理由を見ません追加している文字列が末尾に追加されます。誰かがここで私を助けることができる?
更新 以下の回答を参照してください。しかしながら、より速い参照のために、問題は一般に "print()"を使用しています。変数を割り当てた後にsys.stdout.writeと置き換えてください。
バットから離れた長期的な/より大きなプロジェクトでは、 "ロギング"も使用してください。
私はPythonに組み込みロギング機能があることを知っています。現在のところ、私のプロジェクトはフリーズポイントになっているので、私は迅速かつ厄介な修正がほしいだけの大きな変更はできません。上記のモジュールでより良いロガーを実装できるようになるまでは、可能な場合は、私の現在の問題のみを修正したいと思います。 "ロギング"が標準出力をstdoutとファイルの両方に出力できない場合、これは私の問題を解決しません。 – Tristan
Pythonロガーには複数のハンドラ、_ie_:コンソールとファイルの両方が同時に存在することがあります。私は、Pythonの組み込みログモジュールを_重要な変更_を使用することは考えていません。 IMOは簡単に使用して実装するのが簡単です。また、多くの利点があります。たとえば、簡単にオン/オフを切り替えることができます。 IMOは、カスタムロガーをゼロから作成することははるかに大きな課題です。 :) –
OK!あなたはその出力がどれほど詳細であるかを私に教えてくれました。しかし、私の以前の実装がなぜこのような不思議なことをするのかは、まだ不思議です。 – Tristan