堵塞的重点是什么?
我一直在想,堵塞的目的是什么?据我所知,clog与cerr相同,但具有缓冲功能,因此效率更高。通常stderr与stdout相同,因此clog与cout相同。这对我来说似乎很la脚,所以我认为我一定会误会它。如果我将日志消息发送到同一位置,将错误消息发送到同一位置(也许在/ var / log / messages中),那么我可能不会写太多消息(因此,使用non命令不会造成太多损失)缓冲的cerr)。根据我的经验,我希望日志消息是最新的(非缓冲的),因此我可以查找崩溃(因此,我不想使用缓冲的堵塞)。显然我应该一直使用cerr。
我希望能够在我的程序中重定向堵塞。重定向cerr很有用,这样当我调用库例程时,我可以控制cerr和clog的去向。一些编译器可以支持吗?我刚刚检查了DJGPP,并将stdout定义为FILE结构的地址,因此执行" stdout = freopen(...)"之类的操作是非法的。
- 是否可以重定向阻塞,cerr,cout,stdin,stdout和/或者stderr?
- clog和cerr之间唯一的区别是缓冲吗?
- 我应该如何实施(或者找到)更强大的日志记录功能(请链接)?
解决方案
回答
Is it possible to redirect clog, cerr, cout, stdin, stdout, and/or stderr?
是的。我们需要rdbuf
函数。
ofstream ofs("logfile"); cout.rdbuf(ofs.rdbuf()); cout << "Goes to file." << endl;
Is the only difference between clog and cerr the buffering?
据我所知,是的。
回答
如果我们在posix shell环境中(我真的在考虑bash),则可以重定向任何
文件描述符到任何其他文件描述符,因此要重定向,我们可以:
$ myprogram 2>&5
将stderr重定向到fd = 5表示的文件。
编辑:经过深思熟虑,我更喜欢@Konrad Rudolph关于重定向的答案。 rdbuf()是一种更一致且可移植的方法。
至于日志记录,...我从Boost库开始,处理所有不在std库中的C ++。看得出来:Boost Logging v2
编辑:Boost日志记录不是Boost库的一部分;它已经过审查,但未被接受。
编辑:两年后,即2010年5月,Boost接受了一个日志库,现在称为Boost.Log。
当然,还有其他选择:
- Log4Cpp(适用于C ++的log4j样式的API)
- Log4Cxx(Apache支持的log4j样式的API)
- Pantheios(已解散?上次尝试时无法使它建立在最新的编译器上)
- Google的GLog(提示@SuperElectric)
还有Windows事件记录器。
还有一些可能有用的文章:
- 登录C ++(Dobbs博士)
- 简化的日志记录和跟踪(Sun)
回答
基本记录仪
#define myerr(e) {CriticalSectionLocker crit; std::cerr << e << std::endl;}
用作myerr(" ERR:" <<消息);
或者`myerr(" WARN:" <<消息<<代码<<等);
是非常有效的。
然后做:
./programname.exe 2> ./stderr.log perl parsestderr.pl stderr.log
或者只是手动解析stderr.log
我承认这不是针对性能至关重要的代码。但是反正是谁写的。