Назад | Перейти на главную страницу

Не удается записать ошибку повара в файл

Если я запустил следующее:

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 определяет, подключен ли он к фактическому файловому дескриптору, и подавляет вывод, если это так. Кто-нибудь знает, как остановить это?

Кажется, Chef выводит ошибку в STDERR вместо STDOUT, несмотря на указание STDOUT в качестве файла журнала. Следующая команда должна работать:

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

Я придумал аккуратный хак

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

Делает именно то, что хочу.

Кажется, лучший вариант, чем два других ответа:

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

В doc format печатает ход выполнения chef-client, используя полные строки, отображающие сводку обновлений по мере их появления.