私はpexpectを使用してtelnetおよびssh通信を処理しています。また、すべての要求/応答をログファイルに書き込んでいます。を使用しpexpect.logfile(filename)
ます。
ログファイルにもタイムスタンプを入れたいのですが。ドキュメントのどこにも見つかりません!誰かがこの機能を実装する方法を知っていますか?
私はpexpectを使用してtelnetおよびssh通信を処理しています。また、すべての要求/応答をログファイルに書き込んでいます。を使用しpexpect.logfile(filename)
ます。
ログファイルにもタイムスタンプを入れたいのですが。ドキュメントのどこにも見つかりません!誰かがこの機能を実装する方法を知っていますか?
logfile
メソッドを持つ任意write()
のオブジェクトにすることができます。flush()
from datetime import datetime
class TimestampedFile(object):
def __init__(self, file):
self.file = file
def write(self, data):
# .. filter data however you like
ts = datetime.utcnow().isoformat() # generate timestamp
return self.file.write("%s %s\n" % (ts, data)) # write to original file
def flush(self):
self.file.flush()
with open(filename, 'w') as file:
pexpect.run('echo "hello world!"', logfile=TimestampedFile(file))
ロギングの例は単純化できます。
class FileAdapter(object):
def __init__(self, logger):
self.logger = logger
def write(self, data):
# NOTE: data can be a partial line, multiple lines
data = data.strip() # ignore leading/trailing whitespace
if data: # non-blank
self.logger.info(data)
def flush(self):
pass # leave it to logging to flush properly
# setup logging to include a timestamp
logging.basicConfig(format="%(asctime)s %(message)s", level=logging.INFO)
# ... run command sometime later
pexpect.run('echo "hello world!"', logfile=FileAdapter(logging.getLogger('foo')))
pexpect.pyソースファイルを見ると、ロギングに採用されているアプローチは、子プロセスとの間で送受信されたものをストリームに書き込むだけであることがわかります(ファイルのsys.stdout
場合もあれば、たとえば、コンソールにログインすることをお勧めします)。したがって、たとえば、出力に標準ライブラリロギングpexpect
モジュールロガーを使用できるようにするために、ソースを変更せずに要求したことは不可能です(ヒント:プロジェクトの機能強化に貢献する良い機会ですか?)。
いくつか検索した後、私は私のために働く以下のコードを見つけました!以下のコードを見てください。
import logging
import pexpect
import re
# this is the method called by the pexpect object to log
def _write(*args, **kwargs):
content = args[0]
# Ignore other params, pexpect only use one arg
if content in [' ', '', '\n', '\r', '\r\n']:
return # don't log empty lines
for eol in ['\r\n', '\r', '\n']:
# remove ending EOL, the logger will add it anyway
content = re.sub('\%s$' % eol, '', content)
return logger.info(content) # call the logger info method with the reworked content
# our flush method
def _doNothing():
pass
logger = logging.getLogger('foo')
hdlr = logging.FileHandler('/bar.log')
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
# give the logger the methods required by pexpect
logger.write = _write
logger.flush = _doNothing
p = pexpect.spawn('echo "hello world !"', logfile=logger)