代码之家  ›  专栏  ›  技术社区  ›  markets

堵塞有什么意义?

  •  49
  • markets  · 技术社区  · 16 年前

    我一直在想,堵塞有什么意义?据我所知,阻塞与CERR是相同的,但有缓冲,所以更有效。通常stderr与stdout相同,所以clog与cout相同。这对我来说似乎很差劲,所以我想我一定是误解了。如果我将日志消息发送到相同的位置,我将有错误消息发送到该位置(可能是/var/log/messages中的某个位置),那么我可能不会写太多(因此使用非缓冲CERR不会损失太多)。根据我的经验,我希望日志消息是最新的(而不是缓冲的),这样我就可以帮助查找崩溃(所以我不想使用缓冲的阻塞)。显然我应该一直使用CERR。

    我想能够重定向阻塞在我的程序内。重新定向cerr会很有用,这样当我调用库例程时,就可以控制cerr和clog的位置。一些编译器可以支持这个吗?我刚刚检查了djgpp,stdout被定义为文件结构的地址,因此执行“stdout=freopen(…)”之类的操作是非法的。

    • 是否可以重定向clog、cerr、cout、stdin、stdout和/或stderr?
    • CLOG和CERR的唯一区别是缓冲吗?
    • 我应该如何实现(或找到)一个更健壮的日志记录工具(请链接)?
    3 回复  |  直到 8 年前
        1
  •  35
  •   Konrad Rudolph    16 年前

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

    对。你想要 rdbuf 功能。

    ofstream ofs("logfile");
    cout.rdbuf(ofs.rdbuf());
    cout << "Goes to file." << endl;
    

    CLOG和CERR的唯一区别是缓冲吗?

    据我所知,是的。

        2
  •  14
  •   hochl Michael Aaron Safyan    8 年前

    如果您在posix shell环境中(我真的在考虑bash),那么可以重定向 文件描述符到任何其他文件描述符,因此要重定向,您只需:

    $ myprogram 2>&5 
    

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

    编辑:再想一想,我更喜欢@konrad rudolph关于重定向的回答。rdbuf()是一种更为连贯和可移植的方法。

    至于日志记录,嗯……我先从STD库中的所有C++的Boost库开始。看到: Boost Logging v2

    编辑 :Boost日志记录是 Boost库的一部分;它已被审查,但未被接受。

    编辑 :2年后,回到2010年5月,Boost接受了一个日志库,现在叫做 Boost.Log .

    当然,还有其他选择:

    还有Windows事件记录器。

    以及一些可能会用到的物品:

        3
  •  0
  •   greatwolf Romowski    11 年前

    基本记录器

    #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
    

    或者只是手工分析stderr.log

    我承认这不是为了 极其 性能关键代码。但是谁写的呢?