如果我运行以下:
chef-client --force-formatter --logfile STDOUT 2>&1
然后控制它在运行中(或遇到任何forms的错误)我看到这个不错的错误信息:
[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
然后控制c,我看到所有的日志消息,除了那个好消息告诉我发生了什么。 我也滚动的文件也没有显示致命的消息。
所以显然厨师客户端是检测是否pipe道到实际的文件描述符,并抑制输出,如果是。 有没有人知道一个办法来阻止它这样做?
看来Chef将错误输出到STDERR而不是STDOUT,尽pipe指定STDOUT作为日志文件。 以下命令应该工作:
chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log
我想出了一个整洁的黑客
script -c chef-client /tmp/chef.log
正是我想要的。
比其他两个答案更好的select是:
chef-client -o recipe_name --format doc --no-color | tee output.log
doc格式使用完整的string打印厨师 – 客户端运行的进度,这些string显示更新的摘要。