如果我运行以下命令:
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 运行的进度,并显示更新发生的摘要。