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