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(...)".
- Is it possible to redirect clog, cerr, cout, stdin, stdout, and/or stderr?
- Is the only difference between clog and cerr the buffering?
- How should I implement (or find) a more robust logging facility (links please)?
If you're in a posix shell environment (I'm really thinking of bash), you can redirect any file descriptor to any other file descriptor, so to redirect, you can just:
to redirect stderr to the file represented by fd=5.
Edit: on second thought, I like @Konrad Rudolph's answer about redirection better. rdbuf() is a more coherent and portable way to do it.
As for logging, well...I start with the Boost library for all things C++ that isn't in the std library. Behold: Boost Logging v2
Edit: Boost Logging is not part of the Boost Libraries; it has been reviewed, but not accepted.
Edit: 2 years later, back in May 2010, Boost did accept a logging library, now called Boost.Log.
Of course, there are alternatives:
There's also the Windows Event logger.
And a couple of articles that may be of use:
Yes. You want the
rdbuf
function.As far as I know, yes.
Basic Logger
Used as
myerr("ERR: " << message);
ormyerr("WARN: " << message << code << etc);
Is very effective.
Then do:
or just parse stderr.log by hand
I admit this is not for extremely performance critical code. But who writes that anyway.