Как переопределить и cerr, и clog для обоих tee в общий файл журнала?
Связанный вопрос здесь показывает, как сделать это с помощью только засорения:
Как переопределить сабо, чтобы перейти к оригинальному сабо и файлу журнала?
Теперь вопрос заключается в том, как сделать это для cerr одновременно. С учетом вышеприведенного вопроса вывод в cerr не заканчивается в файле журнала, где он также необходим.
Цель состоит в том, чтобы все, что идет либо в clog, либо в cerr, попадало в файл журнала один раз, поэтому и clog, и cerr должны быть переданы в общий файл журнала.
1 ответ
Решение
Этот код перенаправит как std::cout, так и std::cerr в выходной файл:
// create an output stream
std::ofstream trace_log ( "/tmp/foo.log" );
// connect stream buffers
std::streambuf *coutbuf = std::cout.rdbuf();
std::cout.rdbuf(trace_log.rdbuf () );
std::streambuf *cerrbuf = std::cerr.rdbuf();
std::cerr.rdbuf(trace_log.rdbuf () );
// log
std::cout << "cout here" << std::endl;
std::cerr << "cerr here" << std::endl;
// restore
std::cout.flush ();
std::cout.rdbuf(cerrbuf);
std::cerr.flush ();
std::cerr.rdbuf(cerrbuf);