c++logginglog4cpp

What is the point of clog?


I've been wondering, what is the point of clog? As near as I can tell, clog is the same as cerr but with buffering so it is more efficient. Usually stderr is the same as stdout, so clog is the same as cout. This seems pretty lame to me, so I figure I must be misunderstanding it. If I have log messages going out to the same place I have error messages going out to (perhaps something in /var/log/messages), then I probably am not writing too much out (so there isn't much lost by using non-buffered cerr). In my experience, I want my log messages up to date (not buffered) so I can help find a crash (so I don't want to be using the buffered clog). Apparently I should always be using cerr.

I'd like to be able to redirect clog inside my program. It would be useful to redirect cerr so that when I call a library routine I can control where cerr and clog go to. Can some compilers support this? I just checked DJGPP and stdout is defined as the address of a FILE struct, so it is illegal to do something like "stdout = freopen(...)".


Solution

  • Is it possible to redirect clog, cerr, cout, stdin, stdout, and/or stderr?

    Yes. You want the rdbuf function.

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

    Is the only difference between clog and cerr the buffering?

    As far as I know, yes.