logging-log4cxx-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Curt Arnold <carn...@apache.org>
Subject Re: Use of operator<<
Date Wed, 19 Mar 2008 20:27:49 GMT

On Mar 19, 2008, at 11:40 AM, Jacob L. Anawalt wrote:

> 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,  
> LOG4CXX_LOCATION); }}

The on-line docs have not been updated and that code does not reflect  
the current SVN HEAD.  A staged copy of the new online docs 0.10.0 RC2  
can be viewed at http://svn.apache.org/repos/asf/logging/site/trunk/docs/log4cxx/index.html

.  That will be updated for RC3 and the a release candidate is  
accepted, that content will be pushed to the public web site.


>
>
> 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.

As far as I remember, there was no discernible performance difference  
due to the construction of MessageBuffer.

>
>
>> 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.
> janawalt@geckosoftware.com
> 435-752-8026


Mime
View raw message