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 |