logging-log4cxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jacob L. Anawalt" <janaw...@geckosoftware.com>
Subject Re: Use of operator<<
Date Wed, 19 Mar 2008 16:40:34 GMT
Curt Arnold wrote:
> On Mar 18, 2008, at 12:01 PM, Jacob L. Anawalt wrote:
>> again. If it hadn't been, I was thinking that the current online API 
>> docs looked a little more efficient for simple strings (which is where 
>> I currently use the logging macros), and that I would re-implement the 
>> older style macros as LS_LOG4CXX_*(logger,streamInput).
> I don't follow the last sentence.  The current macro definitions (and 
> the implementation of the supporting classes) attempts to avoid the use 
> of an actual std::basic_ostream if possible, so it should be more 
> efficient for logging simple strings than the 0.9.7 implementation or an 
> alternative using logstream.

I hadn't looked at how the latest (svn HEAD) auto-detecting method worked, so I 
was going off of your statement that "...experimentation hopefully results...", 
and stating that in case it didn't, I could simply fall back to writing my own 
macros like the 0.9.7 ones.

Since 'current' seemed to get a little blurred, this is what I was referring to:

1) 0.9.7 version:
#define LOG4CXX_DEBUG ( logger, message ) { \
         if (logger->isDebugEnabled()) {\
         ::log4cxx::StringBuffer oss; \
         oss << message; \
         logger->forcedLog(::log4cxx::Level::DEBUG, oss.str(), __FILE__, 
__LINE__); }}

2) current online API docs:
#define LOG4CXX_DEBUG (logger,message) { \
         if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) {\
            logger->forcedLog(::log4cxx::Level::getDebug(), message, 

It seemed to me that 2 is more efficient than 1 when the argument to the macro 
is either a static string, eg "Hello World", or a std::string containing some 
string my program needed to generate anyway because 2 does not create a 
temporary StringBuffer and avoids the << and str() function calls.

3) this morning's svn HEAD (which I wasn't referring to before):
#define LOG4CXX_DEBUG ( logger, message ) { \
         if (LOG4CXX_UNLIKELY(logger->isDebugEnabled())) {\
            ::log4cxx::helpers::MessageBuffer oss_; \
            logger->forcedLog(::log4cxx::Level::getDebug(), oss_.str(oss_ << 
message), LOG4CXX_LOCATION); }}

Taking an initial look at 3 this morning, it appears to create a temporary 
object, and call << and str() as well. Based on what you have said about 3 
avoiding creating an ostream, it must be more efficient than 1 and possibly only 
slightly less efficient than 2. Someone needing that extra boost and only using 
strings may prefer to duplicate 2 with their own localized name.

> Adding W would not transparently support logging TCHAR* 

True, and MessageBuffer appears to be a clever solution to this.

I haven't had luck with everything 'just working' when defining UNICODE or not 
so instead I specify what my stream and character types are and define 
conversion boundaries within the software. The days are fading away where I even 
care to write something new for MS Windows desktops that isn't UNICODE inside. I 
am glad you have a solution that works for all of us.

Thank you,
Jacob Anawalt
Gecko Software, Inc.

View raw message