2013-09-22 7 views
5

मैं जानकारी का एक स्तर या अधिक प्रयोग के साथ सभी SSH/Paramiko से संबंधित उत्पादन लॉग इन करने के कपड़ा की स्थापना की है:कपड़ा लॉग प्रारूप दिनांक और समय प्रदर्शित करने के लिए

यह एक लॉग इस तरह देख में परिणाम है:

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

यह इतना दिनांक और समय बगल में मुद्रित प्रत्येक पंक्ति भी है कि ssh.transport लकड़हारा के लिए फ़ॉर्मेटर बदलने के लिए संभव है?

उत्तर

4

alecxe said के रूप में, प्रारूप फैब्रिक 1.x में हार्डकोड किया गया है (जब मैं इसे पोस्ट कर रहा हूं, केवल एक ही संस्करण उपलब्ध है।) a rejected pull request था जो इसका उपचार कर सकता था।

तो इसके बजाय हमें एक कार्य की आवश्यकता है। यह एक हैकी समाधान है जिसे मैंने लिखा है, लेकिन यह फैब्रिक के अनियंत्रित हिस्सों पर निर्भर करता है, जिसका अर्थ है कि यह भविष्य के संस्करणों में टूट सकता है।

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 लाइन fabric.operations._run_command से लगभग 900 लाइन के आसपास आती है। मुझे यकीन नहीं है कि आप इसे संशोधित कर सकते हैं।

3

अब यह संभव नहीं है। प्रारूप हार्डकोडेड है: 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. 
... 

आशा है कि मदद करता है ।

0

मैं भी _flush() को बदलने से अलग करने का कोई तरीका नहीं ढूंढ पाया। मुझे आम तौर पर यह किसी भी वर्ग में निजी विधि को बदलने के लिए एक जोखिम भरा अभ्यास है, अकेले तीसरे पक्ष को छोड़ दें। यहां एक समाधान है जो फैब्रिक _flush() विधि को सजाने और टाइमस्टैम्प को प्रारूपित करने के लिए देशी पायथन 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') 

परीक्षण यह पता है, अपने उत्पादन की तरह कुछ सदृश चाहिए

संबंधित मुद्दे