Re: [Log4cplus-devel] compatibility question concerning log4cplus::tstring
Logging Framework for C++
Brought to you by:
wilx
|
From: Václav Z. <vha...@gm...> - 2012-08-02 09:00:28
|
On 1 August 2012 17:13, John Lumby wrote:
> Hello, I'd like to ask about compatibility of log4cplus::tstring between 1.0.x and 1.1.x
As I have written in reply in another thread, my intention has always
been to keep log4cplus source compatible between versions.
>
> An application (bind10) has some code like so:
>
> // Convert logging level to string. If the level is a valid debug level,
> // return the string DEBUG, else return the empty string.
> log4cplus::tstring
> LoggerLevelImpl::logLevelToString(log4cplus::LogLevel level) {
> Level bindlevel = convertToBindLevel(level);
> Severity& severity = bindlevel.severity;
> int& dbglevel = bindlevel.dbglevel;
>
> if ((severity == DEBUG) &&
> ((dbglevel >= MIN_DEBUG_LEVEL) && (dbglevel <= MAX_DEBUG_LEVEL))) {
> return (tstring("DEBUG"));
> }
>
> // Unknown, so return empty string for log4cplus to try other conversion
> // functions.
> return (tstring());
> }
>
> // Initialization. Register the conversion functions with the LogLevelManager.
> void
> LoggerLevelImpl::init() {
>
> // Get the singleton log-level manager.
> LogLevelManager& manager = getLogLevelManager();
>
> // Register the conversion functions
> manager.pushFromStringMethod(LoggerLevelImpl::logLevelFromString);
> manager.pushToStringMethod(LoggerLevelImpl::logLevelToString);
> }
>
> which compiles correctly against 1.0.x
>
> But compiling against 1.1.x results in
>
> logger_level_impl.cc:189:1: error: prototype for
> ‘const tstring& isc::log::LoggerLevelImpl::logLevelToString(log4cplus::LogLevel)’
> does not match any in class ‘isc::log::LoggerLevelImpl’
> ../../../src/lib/log/logger_level_impl.h:115:31: error:
> candidate is: static log4cplus::tstring isc::log::LoggerLevelImpl::logLevelToString(log4cplus::LogLevel)
> In static member function ‘static void isc::log::LoggerLevelImpl::init()’:
>
> Changing the application code to read as follows fixes the problem ...
>
> // Convert logging level to string. If the level is a valid debug level,
> // return the string DEBUG, else return the empty string.
> log4cplus::tstring const &
> LoggerLevelImpl::logLevelToString(log4cplus::LogLevel level) {
>
> static const tstring debug_string("DEBUG");
> static const tstring empty_string;
>
> Level bindlevel = convertToBindLevel(level);
> Severity& severity = bindlevel.severity;
> int& dbglevel = bindlevel.dbglevel;
>
> if ((severity == DEBUG) &&
> ((dbglevel >= MIN_DEBUG_LEVEL) && (dbglevel <= MAX_DEBUG_LEVEL))) {
> return (debug_string);
> }
>
> // Unknown, so return empty string for log4cplus to try other conversion
> // functions.
> return (empty_string);
> }
>
> but creates two new problems:
> . code is less general - every possible string value which might be returned must be explicitly declared
> (fortunately there are only two - "DEBUG" and "")
I do not regard this as a problem. The set of log levels is intended
to be small. The change of return type to reference to tstring is
there for speed.
> . code no longer compiles against 1.0.x -
This is a problem. What you have discovered breaks the source
compatibility intention and I am going to fix it by allowing both old
and new callbacks.
> logger_level_impl.cc: In static member function 'static void
> isc::log::LoggerLevelImpl::init()':
> logger_level_impl.cc:217: error: invalid conversion from 'const
> log4cplus::tstring& (*)(log4cplus::LogLevel)' to 'log4cplus::tstring
> (*)(log4cplus::LogLevel)'
> logger_level_impl.cc:217: error: initializing argument 1 of 'void
> log4cplus::LogLevelManager::pushToStringMethod(log4cplus::tstring
> (*)(log4cplus::LogLevel))'
>
> Has anyone else run into this?
> And is it possible to write the application code for registering and running the logLevelToString() method in such a way that it
> compiles correctly against both log4cplus releases?
--
VZ
|