|
Boost : |
From: Daniel Frey (d.frey_at_[hidden])
Date: 2004-03-18 18:03:02
Rob Stewart wrote:
> From: "Neal D. Becker" <ndbecker2_at_[hidden]>
>
>>John Torjo wrote:
>>
>>>Neal D. Becker wrote:
>>>
>>>
>>>>I notice boost doesn't have a logging library. I have seen several
>>>>floating
>>>>around. Are there any recommendations?
>>>
>>>How about std::ostream ;) ?
>>>
>>>Also, disabling writing to a stream is fairly easy, by setting the
>>>failbit of a stream object:
>>>out.setstate( std::ios::failbit); // nothing gets written to this log
>>>any more
>>
>>Interesting idea. I would like the overhead of disabled loggers to be
>>relatively small. Would you think this technique might be useful in that
>>case? (Of course, relatively small is a relative term).
>
>
> Every insertion and every mf you call on the stream must occur
> and must check the failbit flag. It would, therefore, have
> noticeable overhead. Is it a problem? Maybe. You could time an
> app with the logging compiled away (via preprocessor) and with
> the failbit set.
I think it's the wrong approach. In our company we have implemented
logging through macros which has one very important property: When I write
LOG_DEBUG( whatever() );
into my source, then whatever() is only evaluated when the debug-logger
is active. The macro basically expands to something like this:
if( Base::hasLogger( LogLevel::DEBUG ) )
Base::log( whatever(), LogLevel::DEBUG );
I think this cannot be done without macros as normal function calls
(including operator<< for streams) need to evaluate their arguments
before they are called. As the difference in the application execution
speed can vary by a factor of 1000, this is a very valuable optimization
for us. My 2¢.
Regards, Daniel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk