2013-09-22 47 views
5

我已经设置面料高达记录与信息的级别或使用更高所有SSH /的paramiko相关的输出:面料日志格式来显示日期和时间

这导致在日志中这样看:

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

是否有可能使每一行也有日期和时间打印旁边改变格式化为ssh.transport记录?

回答

4

由于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 

从这里开始,远程机器的任何输出都会有时间戳。

例如,如果没有这个代码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()方法,并使用本机Python time.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 [email protected] done. 
Disconnecting from [email protected] done.