2

私はpexpectを使用してtelnetおよびssh通信を処理しています。また、すべての要求/応答をログファイルに書き込んでいます。を使用しpexpect.logfile(filename)ます。

ログファイルにもタイムスタンプを入れたいのですが。ドキュメントのどこにも見つかりません!誰かがこの機能を実装する方法を知っていますか?

4

3 に答える 3

6

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')))
于 2012-11-09T10:16:07.387 に答える
1

pexpect.pyソースファイルを見ると、ロギングに採用されているアプローチは、子プロセスとの間で送受信されたものをストリームに書き込むだけであることがわかります(ファイルのsys.stdout場合もあれば、たとえば、コンソールにログインすることをお勧めします)。したがって、たとえば、出力に標準ライブラリロギングpexpectモジュールロガーを使用できるようにするために、ソースを変更せずに要求したことは不可能です(ヒント:プロジェクトの機能強化に貢献する良い機会ですか?)。

于 2012-11-07T19:24:41.177 に答える
1

いくつか検索した後、私は私のために働く以下のコードを見つけました!以下のコードを見てください。

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)
于 2012-11-08T12:29:20.593 に答える