Как переопределить и 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);
Другие вопросы по тегам