Как переопределить и cerr, и clog для обоих tee в общий файл журнала? - PullRequest
0 голосов
/ 25 декабря 2010

Смежный вопрос здесь показывает, как сделать это с помощью только засорения:

Как переопределить сабо, чтобы перейти к исходному сабо и файлу журнала?

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

Цель состоит в том, чтобы все, что касается либо clog, либо cerr, попадало в файл журнала один раз, поэтому и clog, и cerr должны быть переданы в общий файл журнала.

1 Ответ

1 голос
/ 26 декабря 2010

этот код перенаправит как 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);
...