织物日志格式显示日期和时间

2024-04-29 06:05:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经将Fabric设置为记录所有SSH/Paramiko相关的输出,并使用以下信息级别或更高级别:

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

这将生成如下所示的日志:

^{pr2}$

是否可以更改ssh.传输让每一行也有日期和时间打印在它旁边?在


Tags: info信息paramikologging记录级别sshfabric
3条回答

现在不可能了。格式是硬编码的:请参见source。在

仅供参考,有一个proposal在问你到底是什么样的人。在


您可以使用asctime设置日志格式,但它不会影响结构输出,只影响paramiko输出:

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

输出示例:

^{pr2}$

希望有帮助。在

作为alecxe said,格式是在fabric1.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"')的输出将是:

^{pr2}$

但添加后,您将得到:

[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行。我不确定你能用什么简单的方法来修改它。在

除了替换_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')

通过测试,您的输出应该类似于:

^{pr2}$

相关问题 更多 >