fabric输出设置

fab 的输出默认情况下是非常复杂的,几乎是将尽可能地输出所有能输出的内容,包括远程服务器的 stderr 和 stdout 输出流、被执行的命令,等等。在很多情况下,为了了解远程的执行进度这是必须的,但是对于复杂的 Fabric 任务,输出太杂乱,会导致日志什么用也没有。


输出等级

为了改进任务输出,Fabric 的输出会被整合进一系列基本独立的层级或者集合,其中每一个都以独立开启或关闭。这为用户端的输出提供了灵活的控制。

所有层级的输出在 debug 和 exceptions 情况下默认都会保存下来。


标准输出层级

标准的原子输出层级/集合包括以下:

  • status:状态信息。包括提示 Fabric 已结束运行、用户是否使用键盘中止操作、或者服务器是否断开了连接。通常来说这些信息都不会很冗长,但是至关重要。

  • aborts:终止信息。和状态信息一样,只有当 Fabric 做为库使用的时候才可能应该关闭,而且还并不一定。注意,即使该输出集被关闭了,并不能阻止程序退出——你只会得不到任何 Fabric 退出的原因。

  • warnings:警报信息。通常在预计指定操作失败时会将其关闭,比如说你可能使用 grep 来测试文件中是否有特定文字。如果设置 env.warn_only 为 True 会导致远程程序执行失败时完全没有警报信息。和 aborts 一样,这项设置本身并不控制警报行为,仅用于是否输出警报信息。

  • running:输出正在执行的命令或者正在传输的文件名称,比如: [myserver] run: ls /var/www。同时它还输出正在运行的任务名,比如:[myserver] Executing task 'foo'。

  • stdout:本地或远程的 stdout。来自命令行的非错误输出。

  • stderr:本地或远程的 stderr。比如命令中错误相关的输出。

  • user:用户生成的输出。比如:fabfile 中使用 fastprint 或者 puts 函数产生的输出。


调试输出

在调试问题的时候还有几个可用的原子输出级别:debug,和其它的都有所不同;exceptions,其行为只能包含在 debug 中,不过也可以单独设定。

debug:开启调试模式(默认是关闭的)。现在它通常是用于浏览正在执行的“全部”命令,以这个 run 调用为例:

run('ls "/home/username/Folder Name With Spaces/"')

通常情况下 running 会详细显示 run 所接收到的内容,就像这样:

[hostname] run: ls "/home/username/Folder Name With Spaces/" 开启 debug 模式,同时保证 shell 设置是 `True,你将会看到传向远程服务器的所有字符都会输出出来:

[hostname] run: /bin/bash -l -c "ls \"/home/username/Folder Name With Spaces\"" 启用 debug 时输出同时还会显示推出时的完整的 Python traceback(如果 exceptions 也启用了的话)。

注解 修改其它输出(比如上面例子中修改“running”那一行来显示 shell 以及任何转译字符),这项设置的优先级处于最高;因此如果 running 为 False 但 debug 为 True,你还是可以在调试区看到 “running”那一行。

exceptions:异常发生时是否显示 traceback。如果你对详细的错误信息感兴趣,但 debug 为 False 时可以使用。

在 1.0 版更改: 终止时的调试输出现在会包含整个 Python traceback。

在 1.11 版更改: 新增 exceptions 输出级别。


输出级别的别名

作为对上述原子/独立级别的补充,Fabric 还提供了一系列方便的对应多个级别的别名,这可能会涉及到一些其它级别涉及的地方,可以用于高效地切换它所对应的级别的状态。

output:对应 stdout 和 stderr。如果你只关心“运行”进度和自己设置的输出(和警报),会觉得它很方便。

everything:包括 warnings、running、user 和 output (见上面介绍)。因此,关闭 everything,你将只能够看到零星输出(只有 status 和 debug,如果它们是开启状态的话),以及自己的打印信息。

commands:包含 stdout 和 running。适合用于隐藏无错误的命令,只显示所有 stderr 输出。

在 1.4 版更改: 新增 commands 的输出别名。

隐藏和/或显示输出级别 你可以通过多种方式切换 Fabric 的输出层级,你可以看看下面每条对应的 API 文档作为例子:

直接修改 fabric.state.output:fabric.state.output 是字典的子类(类似于 env),以输出层级名为键,值为真(显示某个层级的输出)或假(隐藏)。

fabric.state.output 是最底层的输出层级实现,也是 Fabric 决定是否输出的直接引用。

上下文管理器:hide 和 show 是决定被包含的命令输出是隐藏还是显示的两个上下文管理器,接受一个或多个层级字符串名做为参数。和其它上下文管理器一样,退出被包含的代码块时,设置会恢复原状。

参见 settings 可以在内部嵌套调用 hide 以及/或者 show。

命令行参数:你可以使用 fab 选项和参数 --hide 以及/或者 --show,其效果正如其名(不过,如你所想,会是全局应用),其参数应当是逗号分隔的字符输入。