Eu descobri um hack puro
script -c chef-client /tmp/chef.log
Faz exatamente o que eu quero.
Se eu executar o seguinte:
chef-client --force-formatter --logfile STDOUT 2>&1
E, em seguida, control-c-mid-run (ou encontrar qualquer tipo de erro) vejo esta mensagem de erro:
[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
Mas se eu fizer o seguinte:
chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log
E, em seguida, control-c, vejo todas as mensagens de log que eu estava vendo antes, com exceção da mensagem fatal que me dizia o que estava acontecendo. O arquivo que estou passando também não mostra a mensagem fatal.
Então, aparentemente, o chef-client está detectando se está ou não direcionando para um descritor de arquivo real e suprimindo a saída, se estiver. Alguém sabe de uma maneira de impedir isso?
Parece que o Chef envia o erro para STDERR em vez de STDOUT, apesar de especificar STDOUT como logfile. O seguinte comando deve funcionar:
chef-client --force-formatter --logfile STDOUT 2>&1 | tee /tmp/chef.log
Uma opção melhor do que as outras duas respostas parece ser:
chef-client -o recipe_name --format doc --no-color | tee output.log
O formato doc
imprime o progresso da execução chef-client usando strings completas que exibem um resumo das atualizações à medida que ocorrem.
Tags chef