5

以下を使用して、すべての SSH/Paramiko 関連の出力を INFO 以上のレベルでログに記録するように Fabric を設定しました。

logging.basicConfig()
logging.getLogger('ssh.transport').setLevel(logging.INFO)

これにより、ログは次のようになります。

[host1] Executing task 'task1'
[host1] Run: ls
...

ssh.transport ロガーのフォーマッターを変更して、各行の横に日付と時刻も出力されるようにすることはできますか?

4

3 に答える 3

6

alecxe が言っように、このフォーマットは Fabric 1.x でハードコーディングされています (私がこれを投稿している時点で、利用可能な唯一のバージョンです) 。

そのため、代わりに回避策が必要です。これは私が書いたかなりハックなソリューションですが、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

この時点から、リモート マシンからのすべての出力にタイムスタンプが付きます。

たとえば、このコードがないと、出力sudo('echo "test"')は次のようになります。

[InteractSL-DT1.usma.ibm.com] sudo: echo "test"
[InteractSL-DT1.usma.ibm.com] out: test
[InteractSL-DT1.usma.ibm.com] out:

'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行は、900 行目あたりから来てfabric.operations._run_commandいます。それを変更できる簡単な方法はわかりません。

于 2015-01-02T18:03:47.947 に答える
0

私も、を置き換える以外にこれを行う方法を見つけることができませんでした_flush()。一般的に、サードパーティは言うまでもなく、任意のクラスのプライベート メソッドを置き換えるのは危険な行為だと思います。Fabric_flush()メソッドを装飾し、ネイティブの Pythontime.asctimeメソッドを使用してタイムスタンプをフォーマットするソリューションを次に示します。

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')

テストすると、出力は次のようになります。

> 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 ec2-user@10.0.1.3... done.
Disconnecting from ec2-user@10.0.1.2... done.
于 2016-12-15T19:44:42.300 に答える