无法捕获 Chef 错误到文件

无法捕获 Chef 错误到文件

如果我运行以下命令:

chef-client --force-formatter --logfile STDOUT 2>&1

然后在运行中途按下 control-c(或者遇到任何类型的错误)我看到了这条很好的错误消息:

[2014-09-12T00:00:30-04:00] FATAL: SIGINT received, stopping

================================================================================
Recipe Compile Error in /var/cache/chef/cookbooks/users/recipes/fen.rb
================================================================================


SystemExit
----------
exit


Cookbook Trace:
---------------
  /var/cache/chef/cookbooks/users/recipes/default.rb:11:in ``'
  /var/cache/chef/cookbooks/users/recipes/default.rb:11:in `from_file'
  /var/cache/chef/cookbooks/users/recipes/fen.rb:15:in `from_file'


Relevant File Content:
----------------------
/var/cache/chef/cookbooks/users/recipes/default.rb:

etc...

[2014-09-12T00:00:30-04:00] ERROR: Running exception handlers
[2014-09-12T00:00:30-04:00] ERROR: Exception handlers complete
[2014-09-12T00:00:30-04:00] FATAL: Stacktrace dumped to /var/cache/chef/chef-stacktrace.out
Chef Client failed. 0 resources updated

但如果我执行以下操作:

chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log

然后按 Control-C,我可以看到之前看到的所有日志消息,除了那条告诉我发生了什么的致命消息。我正在传输的文件也没有显示致命消息。

因此,显然 chef-client 正在检测它是否正在通过管道传输到实际的文件描述符,如果是,则抑制输出。有人知道有什么方法可以阻止它这样做吗?

答案1

尽管将 STDOUT 指定为日志文件,但 Chef 似乎将错误输出到 STDERR 而不是 STDOUT。以下命令应该有效:

chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log

答案2

我想到了一个巧妙的办法

script -c chef-client /tmp/chef.log

正是我想要的。

答案3

比其他两个答案更好的选择似乎是:

chef-client -o recipe_name --format doc --no-color | tee output.log

doc格式使用完整字符串打印 chef-client 运行的进度,并显示更新发生的摘要。

相关内容