堵塞点是什么?

我一直在想,堵塞点是什么? 据我所知,堵塞是一样的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

我承认这不是针对性能非常关键的代码。 但是谁写的呢。