2013-09-22 25 views
5

Mam ustawiony Fabric się zalogować cały ssh/Paramiko związanego wyjście z poziomu INFO lub wyższej, używając:Fabric format dziennika do daty i czasu wyświetlania

Wynika to w dzienniku wygląda tak:

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

Czy jest możliwa zmiana formatowania dla rejestratora ssh.transport tak, że każda linia ma również data i godzina drukowane obok niego?

Odpowiedz

4

Jako alecxe said format jest zakodowany na stałe w Fabric 1.x (od kiedy publikuję to, jedyna dostępna wersja.) Był a rejected pull request, który mógł to naprawić.

Zamiast tego potrzebujemy obejść. Jest to dość hacky rozwiązanie, które napisałem, ale bazuje na nieudokumentowanych częściach Fabric, co oznacza, że ​​może się zepsuć w przyszłych wersjach.

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 

Od tego momentu każde wyjście z komputera zdalnego będzie miało znaczniki czasu.

Na przykład, bez tego kodu wyjście z sudo('echo "test"') byłoby:

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

'test' 

Ale po dodając, że będziesz teraz uzyskać to:

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

Możesz poeksperymentować z tym podstawowym pomysł, żeby to posprzątać. Linia sudo na początku wyjścia pochodzi z fabric.operations._run_command, około linii 900. Nie jestem pewien jakiejkolwiek prostej metody modyfikacji.

3

Teraz nie jest możliwe. Format jest zakodowany na stałe: patrz source.

FYI, istnieje proposal, który prosi o dokładnie to, kim jesteś.


Można ustawić zalogowaniu formatu z asctime wewnątrz, ale to nie wpłynie na produkcję tkanin, te tylko paramiko:

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

Przykâadowa:

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

nadzieję, że pomoże .

0

Ja też nie mogłem znaleźć sposobu, aby to zrobić, oprócz zastępowania _flush(). Ogólnie uważam, że zastąpienie metody prywatnej w dowolnej klasie, nie mówiąc już o trzeciej stronie, jest ryzykowną praktyką. Oto rozwiązanie, które dekoruje metodę Fabric _flush(), a także wykorzystuje natywną metodę Python time.asctime do formatowania znacznika czasu.

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

testowania go, swoją moc powinna wyglądać mniej więcej tak:

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