堵塞有什么意义?

mar*_*ets 51 c++ logging log4cpp

我一直想知道,堵塞的重点是什么?就像我所知,clog和cerr一样,但是有了缓冲,所以效率更高.通常stderr与stdout相同,因此clog与cout相同.这对我来说似乎很蹩脚,所以我认为我必须误解它.如果我将消息发送到同一个地方,我会收到错误信息(可能是/ var/log/messages中的内容),那么我可能不会写太多(因此使用非 - 缓冲的cerr).根据我的经验,我希望我的日志消息是最新的(不缓冲)所以我可以帮助找到崩溃(所以我不想使用缓冲的阻塞).显然我应该一直使用cerr.

我希望能够在我的程序中重定向阻塞.重定向cerr会很有用,这样当我调用库例程时,我可以控制cerr和clog的去向.有些编译器可以支持吗?我刚检查了DJGPP,stdout被定义为FILE结构的地址,因此执行"stdout = freopen(...)"之类的操作是违法的.

  • 是否可以重定向clog,cerr,cout,stdin,stdout和/或stderr?
  • clog和cerr缓冲之间的唯一区别是什么?
  • 我应该如何实现(或找到)更强大的日志记录工具(请链接)?

Kon*_*lph 36

是否可以重定向clog,cerr,cout,stdin,stdout和/或stderr?

是.你想要这个rdbuf功能.

ofstream ofs("logfile");
cout.rdbuf(ofs.rdbuf());
cout << "Goes to file." << endl;
Run Code Online (Sandbox Code Playgroud)

clog和cerr缓冲之间的唯一区别是什么?

据我所知,是的.


Ben*_*ins 14

如果你在posix shell环境中(我真的在想bash),你可以将任何文件描述符重定向到任何其他文件描述符,所以要重定向,你可以:

$ myprogram 2>&5 
Run Code Online (Sandbox Code Playgroud)

将stderr重定向到fd = 5表示的文件.

编辑:第二个想法,我更喜欢@Konrad Rudolph关于重定向的答案.rdbuf()是一种更连贯,更便携的方法.

至于日志记录,那么......我从Boost库开始,用于所有不在std库中的C++.看哪:升级记录v2

编辑:Boost Logging 不是 Boost Libraries的一部分; 它已经过审核,但未被接受.

编辑:2年后,早在2010年5月,Boost确实接受了一个日志库,现在名为Boost.Log.

当然,还有其他选择:

  • Log4Cpp(用于C++的log4j样式API)
  • Log4Cxx(Apache赞助的log4j风格的API)
  • Pantheios(已解散?上次我尝试过我无法在最近的编译器上构建它)
  • 谷歌的GLog(帽子@SuperElectric)

还有Windows事件记录器.

还有一些可能有用的文章:

  • 应该注意的是,"Boost Logging v2"不是提升的一部分,而是提出的库,当它出现审查时可能会或可能不会被接受. (2认同)

小智 6

由于这里有几个关于重定向的答案,我将添加我最近偶然发现的关于重定向的这个不错的宝石:

#include <fstream>
#include <iostream>

class redirecter
{
public:
    redirecter(std::ostream & dst, std::ostream & src)
        : src(src), sbuf(src.rdbuf(dst.rdbuf())) {}
    ~redirecter() { src.rdbuf(sbuf); }
private:
    std::ostream & src;
    std::streambuf * const sbuf;
};

void hello_world()
{
    std::cout << "Hello, world!\n";
}

int main()
{
    std::ofstream log("hello-world.log");
    redirecter redirect(log, std::cout);
    hello_world();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它基本上是一个重定向类,允许您重定向任意两个流,并在完成后恢复它。