私はINFOのレベル以上使用すると、すべてのSSH/Paramiko関連の出力ログに記録するファブリックを設定している:ファブリックログ形式は、日付と時刻を表示する
これは、このように見てログに結果を:
[host1] Executing task 'task1'
[host1] Run: ls
...
は、各ラインも隣に印刷された日付と時刻を持つようにssh.transportロガーのためのフォーマッターを変更することが可能ですか?
私はINFOのレベル以上使用すると、すべてのSSH/Paramiko関連の出力ログに記録するファブリックを設定している:ファブリックログ形式は、日付と時刻を表示する
これは、このように見てログに結果を:
[host1] Executing task 'task1'
[host1] Run: ls
...
は、各ラインも隣に印刷された日付と時刻を持つようにssh.transportロガーのためのフォーマッターを変更することが可能ですか?
alecxe saidとして、このフォーマットはFabric 1.xにハードコードされています(私がこれを投稿した時点で利用可能な唯一のバージョンです)。a rejected pull requestがこれを是正できました。
代わりに回避策が必要です。これは私が書いたかなりハッキリな解決策ですが、Fabricの未記載の部分に依存しています。これは、将来のバージョンで破損する可能性があることを意味します。
from fabric.io import OutputLooper
from datetime import datetime
def newFlush(self, text):
stamp = datetime.now().strftime("%a %b %d %H:%M:%S - ")
print(stamp + text)
OutputLooper._flush = newFlush
この時点から、あなたのリモートマシンからの任意の出力は、タイムスタンプを持つことになります。
[InteractSL-DT1.usma.ibm.com] sudo: echo "test"
[InteractSL-DT1.usma.ibm.com] out: test
[InteractSL-DT1.usma.ibm.com] out:
'test'
しかし、それを追加した後、あなたは今、これを取得します:
たとえば、このコードなしsudo('echo "test"')
からの出力は以下のようになり
[InteractSL-DT1.usma.ibm.com] sudo: echo "test"
Fri Jan 02 12:54:49 - [InteractSL-DT1.usma.ibm.com] out:
Fri Jan 02 12:54:49 - test
Fri Jan 02 12:54:49 - [InteractSL-DT1.usma.ibm.com] out:
Fri Jan 02 12:54:49 -
'test'
あなたはこの基本で遊ぶことができますそれをきれいにするアイデア。出力の最初のsudo
行は、fabric.operations._run_command
の900行目から来ています。私はそれを変更する簡単な方法は不明です。
今はできません。フォーマットはハードコードされています:sourceを参照してください。
参考までに、proposalがあり、あなたのものを正確に求めています。
あなたが内部asctime
と形式のログを設定することができますが、それは、ファブリック出力、唯一paramikoのものは影響しません。
import logging
FORMAT = "%(asctime)s %(name)s %(message)s"
logging.basicConfig(format=FORMAT, level=logging.INFO)
例を出力:
[host] Executing task 'restart'
[host] sudo: ls
2013-09-23 02:36:54,800 paramiko.transport Connected (version 2.0, client OpenSSH_5.3)
2013-09-23 02:36:55,728 paramiko.transport Authentication (password) successful!
2013-09-23 02:36:55,889 paramiko.transport Secsh channel 1 opened.
...
希望に役立ちます。
私も、_flush()
の代わりにこれを行う方法を見つけることができませんでした。私は、一般的に、第三者はもちろんのこと、どのクラスのプライベートメソッドを置き換えるのも危険な習慣であることがわかります。 Fabric _flush()
メソッドをデコレートし、ネイティブのPython time.asctime
メソッドを使用してタイムスタンプをフォーマットするソリューションもあります。
> fab uptime -H 10.0.1.3,10.0.1.2
[10.0.1.3] Executing task 'uptime'
[10.0.1.3] run: uptime
[Thu Dec 15 19:34:35 2016] [10.0.1.3] out: 19:34:35 up 69 days, 4:22, 1 user, load average: 0.05, 0.03, 0.05
[Thu Dec 15 19:34:35 2016] [10.0.1.3] out:
[10.0.1.2] Executing task 'uptime'
[10.0.1.2] run: uptime
[Thu Dec 15 19:34:35 2016] [10.0.1.2] out: 19:34:35 up 70 days, 1:12, 1 user, load average: 0.00, 0.01, 0.05
[Thu Dec 15 19:34:35 2016] [10.0.1.2] out:
Done.
Disconnecting from [email protected] done.
Disconnecting from [email protected] done.
:
def time_decorator(msg):
"""
Decorates `msg` with current timestamp
Args:
msg(str): The log message from fabric
Returns:
str: Original message prepended with current date time
"""
if "\n" not in msg and msg.strip():
return "[%s] %s" % (time.asctime(), msg)
return msg
# Compose original method inside of decorator
_original_flush = OutputLooper._flush
OutputLooper._flush = lambda self, msg: {
_original_flush(self, time_decorator(msg))
}
@task
def uptime():
run('uptime')
テストそれを、あなたの出力は次のように似ている必要があります