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.
[EMAIL PROTECTED]
435-752-8026