[Log4cplus-devel] compatibility question concerning log4cplus::tstring
Logging Framework for C++
Brought to you by:
wilx
|
From: John L. <jl...@bl...> - 2012-08-01 15:26:05
|
Hello, I'd like to ask about compatibility of log4cplus::tstring between 1.0.x and 1.1.x
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 "")
. code no longer compiles against 1.0.x -
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?
John Lumby
|