如何将cerr和clog重新定义为两个tee到共享日志文件?

时间:2010-12-25 16:16:27

标签: c++ logfiles tee clog

此处的相关问题显示了如何使用clog执行此操作:

How to redefine clog to tee to original clog and a log file?

现在的问题是如何同时为cerr做这件事。有了上面的问题,输出到cerr不会在日志文件中结束,也需要它。

目标是无论是clog还是cerr,都会在日志文件中结束一次,因此需要将clog和cerr都转换为共享日志文件。

1 个答案:

答案 0 :(得分: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);