堵塞点是什么?
我一直在想,堵塞点是什么? 据我所知,堵塞是一样的cerr,但与缓冲,所以它是更有效的。 通常stderr和stdout是一样的,所以clog和cout是一样的。 这对我来说似乎很蹩脚,所以我觉得我一定是误会了。 如果我有日志消息发到同一个地方,我有错误消息出去(也许在/ var / log / messages中的东西),那么我可能不会写太多(所以没有太多的使用非 – 缓冲的cerr)。 根据我的经验,我希望我的日志消息是最新的(没有缓冲),所以我可以帮助find崩溃(所以我不想使用缓冲木</s>)。 显然我应该总是使用cerr。
我希望能够在程序中redirect阻塞。 redirectcerr会很有用,所以当我调用一个库例程时,我可以控制cerr和clog的去向。 一些编译器可以支持吗? 我只是检查DJGPP和stdout被定义为一个FILE结构的地址,所以这是非法的做一些像“stdout = freopen(…)”。
- 是否有可能redirect堵塞,cerr,cout,stdin,stdout和/或stderr?
- 阻塞和cerr之间的唯一区别是缓冲吗?
- 我应该如何实现(或find)更强大的日志logging工具(请链接)?
是否有可能redirect堵塞,cerr,cout,stdin,stdout和/或stderr?
是。 你需要rdbuf
函数。
ofstream ofs("logfile"); cout.rdbuf(ofs.rdbuf()); cout << "Goes to file." << endl;
阻塞和cerr之间的唯一区别是缓冲吗?
据我所知,是的。
如果你在一个posix shell环境下(我真的想bash),你可以将任何文件描述符redirect到任何其他文件描述符,所以要redirect,你可以:
$ myprogram 2>&5
将stderrredirect到由fd = 5表示的文件。
编辑:关于第二个想法,我喜欢@Konrad鲁道夫关于redirect的答案更好。 rdbuf()是一个更连贯和便携的方式来做到这一点。
至于日志logging,那么…我开始与Boost库的所有事情不在标准库中的C ++。 看哪: Boost Logging v2
编辑 :Boost Logging 不是 Boost库的一部分; 它已被审查,但不被接受。
编辑 :2年后,在2010年5月,Boost确实接受了一个日志库,现在叫做Boost.Log 。
当然,还有其他的select:
- Log4Cpp (C ++的log4j风格的API)
- Log4Cxx (由Apache赞助的log4j风格的API)
- Pantheios (已停用?上一次我尝试了,我无法使它build立在最近的编译器上)
- Google的GLog (hat-tip @SuperElectric)
还有Windows事件logging器。
还有一些可能有用的文章:
- loginC ++(Dr. Dobbs)
- logging和跟踪简化(Sun)
基本的logging器
#define myerr(e) {CriticalSectionLocker crit; std::cerr << e << std::endl;}
用作myerr("ERR: " << message);
或者myerr("WARN: " << message << code << etc);
非常有效。
然后做:
./programname.exe 2> ./stderr.log perl parsestderr.pl stderr.log
或者只是手工parsingstderr.log
我承认这不是针对性能非常关键的代码。 但是谁写的呢。