Запись сообщений об утверждении в файл журнала - PullRequest
1 голос
/ 03 июня 2019

Я написал приложение на c ++ для запуска на встроенном устройстве под управлением ОС Linux. В целях отладки я вставил операторы std :: cout в свое приложение.

Я запускаю приложение, используя приведенную ниже команду, чтобы сохранить все мои сообщения журнала в файл

./TestApplication > /var/log/test_log

Как и ожидалось, все сообщения журнала хранятся в test_log. Но когда приложение сталкивается с утверждением, сообщение об утверждении не сохраняется в файле журнала.

Мое приложение зависит от множества сторонних пакетов, каждый из которых имеет свою собственную функцию подтверждения. Следовательно, написание собственной пользовательской функции подтверждения для приложения в целом будет слишком сложным, поскольку мне нужно учитывать и сторонние пользовательские утверждения.

Есть ли простой способ выгрузить все мои сообщения журнала и утверждения в файл журнала?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

В системе POSIX (например, Linux или macOS) есть два выходных потока:

  1. Стандартный вывод (используется std::cout в C ++)
  2. Стандартная ошибка (используется std::cerr и std::clog в C ++)

С помощью простого оператора перенаправления оболочки > вы перенаправляете только стандартный вывод, а не стандартную ошибку (где, например, пишутся сообщения подтверждения).

Вы должны указать оболочке, что стандартная ошибка должна совпадать со стандартной выходной информацией, используя 2>&1:

./TestApplication > /var/log/test_log 2>&1

Обратите внимание, что порядок перенаправлений имеет значение.

Подробнее о перенаправлении на странице Bash .


Если вас интересует число в 2>&1, это стандартные номера файловых дескрипторов. Дескриптор 0 - это стандартный ввод (который вы читаете с std::cin); Дескриптор 1 - стандартный вывод; И дескриптор 2 является стандартной ошибкой.

1 голос
/ 03 июня 2019

Команда перенаправляет стандартный вывод в файл test_log . Сообщение Assert записывается в поток stderr. Вместо этого вы должны попробовать:

./TestApplication 1>/var/log/test_log 2>/var/log/test_log_errors

или

./TestApplication 2>&1 > /var/log/test_log

если вы хотите, чтобы все это было в одном файле (2>1& означает «перенаправить stderr в stdout»)

...