2013-09-22 25 views
5

ho impostato Fabric fino a registrare tutte/uscita paramiko legati SSH con un livello di INFO o superiore, utilizzando:formato di registro Tessuto per visualizzare la data e l'ora

Questo si traduce in un registro simile a questo:

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

e 'possibile cambiare il formattatore per il logger ssh.transport in modo che ogni linea ha anche stampato accanto ad essa la data e l'ora?

risposta

4

Come alecxe said, il formato è codificato in 1.x tessuto (come di quando sto postando questo, l'unica versione disponibile.) C'era a rejected pull request che avrebbe potuto porre rimedio questo.

Quindi, invece, abbiamo bisogno di una soluzione. Questa è una soluzione piuttosto hacky che ho scritto, ma si basa su parti non documentate di Fabric, il che significa che potrebbe rompersi nelle versioni future.

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 

Da questo punto in poi, qualsiasi uscita dalla macchina remota avrà data e ora.

Ad esempio, senza questo codice l'uscita dal sudo('echo "test"') sarebbe:

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

'test' 

Ma dopo aver aggiunto che, avrete ora ottiene questo:

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

È possibile giocare con questa base idea di ripulirlo. La riga sudo all'inizio dell'output proviene da fabric.operations._run_command, intorno alla riga 900. Non sono sicuro di alcun modo semplice per modificarlo.

3

Non è possibile ora. Il formato è hardcoded: vedi source.

FYI, c'è un proposal che sta chiedendo esattamente quello che sei.


È possibile impostare la registrazione di formato con un asctime dentro, ma non influenzerà uscita tessuto, quelli solo paramiko:

import logging 
FORMAT = "%(asctime)s %(name)s %(message)s" 
logging.basicConfig(format=FORMAT, level=logging.INFO) 

output di esempio:

[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. 
... 

Speranza che aiuta .

0

Anche io non sono riuscito a trovare un modo per fare questo oltre alla sostituzione di _flush(). In genere trovo che sia una pratica rischiosa sostituire un metodo privato in qualsiasi classe, per non parlare di una terza parte. Ecco una soluzione che decora il metodo Fabric _flush() e utilizza anche il metodo nativo Python time.asctime per formattare il timestamp.

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

test fuori, l'output dovrebbe essere simile a qualcosa di simile:

> 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.