情報をファイルにデバッグする方法は?
質問
ご存知のように、Python Smtplibにはデバッグレベルがあります。真のパラメーションを設定すると、情報を送信するものが印刷されます。
問題は、ファイルにログインするためにデバッグ情報を取得しようとしますが、CMDコンソールにとどまるだけです。どうすればそれらを記録できますか?
このような情報:
connect: ('192.168.1.101', 25)
connect: (25, '192.168.1.101')
reply: '220 ESMTP on WinWebMail [3.8.1.3] ready. http://www.winwebmail.com\r\n'
reply: retcode (220); Msg: ESMTP on WinWebMail [3.8.1.3] ready. http://www.winw
ebmail.com
connect: ESMTP on WinWebMail [3.8.1.3] ready. http://www.winwebmail.com
send: 'ehlo [169.254.63.67]\r\n'
reply: '250-SIZE\r\n'
reply: '250 AUTH LOGIN\r\n'
reply: retcode (250); Msg: SIZE
AUTH LOGIN
bla bla bla bla........
解決
smtplib
に直接印刷 stderr
, 、例:smtplib.pyのライン823:
print>>stderr, 'connect fail:', host
モンキーパッチsys.stderrのいずれかが必要です 前 インポートします smtplib
また smtplib.stderr
前 メールコードを実行します。
パッチを適用することも提案するかもしれません smtplib.stderr
を持つカスタムオブジェクトを使用します write
ロギングコードをラップする方法(ロギングライブラリを使用している場合、たとえば):
import logging
import smtp
class StderrLogger(object):
def __init__(self):
self.logger = logging.getLogger('mail')
def write(self, message):
self.logger.debug(message)
org_stderr = smtp.stderr
smtp.stderr = StderrLogger()
# do your smtp stuff
smtp.stderr = org_stderr
これ 質問 Context Managersを使用してSTDERをパッチングする有用な例がいくつか含まれています。
他のヒント
しばらく前に、SMTPlibをフォークし、ログファイルオプションを追加しました(とりわけ)。必要に応じて、それを試すことができます。また、新しい名前があります、 smtp.py.
ほとんどクリーンではありませんが、SMTPオブジェクトがデバッグ出力がどこにあるかを指定する機能を提供するため、次のようになります。
import sys
orig_std = (sys.stdout, sys.stderr)
sys.stdout = sys.stderr = open("/path/to/log", "a")
# smtplib stuff
sys.stdout, sys.stderr = orig_std
所属していません StackOverflow