From 00913d74d9d3d9e270a5624513adc3939b257ff1 Mon Sep 17 00:00:00 2001 From: "kurtis.heimerl" Date: Sun, 16 Dec 2012 06:08:18 +0000 Subject: [PATCH] Sylvain patch #2, with modifications: CommonLibs: Avoid direct syslog calls in ConfigurationTable We instead introduce a 'log early' facility in Logger.h to accomplish the same Signed-off-by: Sylvain Munaut I added similar code to the reporting functions, which did not exist when sylvain made this patch git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@4629 19bc5d8c-e614-43d4-8b26-e1612bc8e597 --- CommonLibs/Configuration.cpp | 24 ++++++++++++------------ CommonLibs/Configuration.h | 4 +--- CommonLibs/ConfigurationTest.cpp | 2 +- CommonLibs/Logger.cpp | 10 +++++++++- CommonLibs/Logger.h | 2 ++ 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CommonLibs/Configuration.cpp b/CommonLibs/Configuration.cpp index 7d0bea2b..5dcc2776 100644 --- a/CommonLibs/Configuration.cpp +++ b/CommonLibs/Configuration.cpp @@ -27,10 +27,11 @@ #include "Configuration.h" +#include "Logger.h" #include #include #include -#include + using namespace std; @@ -56,10 +57,9 @@ float ConfigurationRecord::floatNumber() const } -ConfigurationTable::ConfigurationTable(const char* filename, const char *wCmdName, int wFacility) - :mFacility(wFacility) +ConfigurationTable::ConfigurationTable(const char* filename, const char *wCmdName) { - syslog(LOG_INFO | mFacility, "opening configuration table from path %s", filename); + gLogEarly(LOG_INFO, "opening configuration table from path %s", filename); // Connect to the database. int rc = sqlite3_open(filename,&mDB); // (pat) When I used malloc here, sqlite3 sporadically crashes. @@ -69,14 +69,14 @@ ConfigurationTable::ConfigurationTable(const char* filename, const char *wCmdNam strcat(gCmdName,":"); } if (rc) { - syslog(LOG_EMERG | mFacility, "cannot open configuration database at %s, error message: %s", filename, sqlite3_errmsg(mDB)); + gLogEarly(LOG_EMERG, "cannot open configuration database at %s, error message: %s", filename, sqlite3_errmsg(mDB)); sqlite3_close(mDB); mDB = NULL; return; } // Create the table, if needed. if (!sqlite3_command(mDB,createConfigTable)) { - syslog(LOG_EMERG | mFacility, "cannot create configuration table in database at %s, error message: %s", filename, sqlite3_errmsg(mDB)); + gLogEarly(LOG_EMERG, "cannot create configuration table in database at %s, error message: %s", filename, sqlite3_errmsg(mDB)); } } @@ -175,7 +175,7 @@ string ConfigurationTable::getStr(const string& key) return lookup(key).value(); } catch (ConfigurationTableKeyNotFound) { // Raise an alert and re-throw the exception. - syslog(LOG_ALERT | mFacility, "configuration parameter %s has no defined value", key.c_str()); + gLogEarly(LOG_ALERT, "configuration parameter %s has no defined value", key.c_str()); throw ConfigurationTableKeyNotFound(key); } } @@ -186,7 +186,7 @@ string ConfigurationTable::getStr(const string& key, const char* defaultValue) ScopedLock lock(mLock); return lookup(key).value(); } catch (ConfigurationTableKeyNotFound) { - syslog(LOG_NOTICE | mFacility, "deinfing missing parameter %s with value %s", key.c_str(),defaultValue); + gLogEarly(LOG_NOTICE, "deinfing missing parameter %s with value %s", key.c_str(),defaultValue); set(key,defaultValue); return string(defaultValue); } @@ -211,7 +211,7 @@ long ConfigurationTable::getNum(const string& key) return lookup(key).number(); } catch (ConfigurationTableKeyNotFound) { // Raise an alert and re-throw the exception. - syslog(LOG_ALERT | mFacility, "configuration parameter %s has no defined value", key.c_str()); + gLogEarly(LOG_ALERT, "configuration parameter %s has no defined value", key.c_str()); throw ConfigurationTableKeyNotFound(key); } } @@ -223,7 +223,7 @@ long ConfigurationTable::getNum(const string& key, long defaultValue) ScopedLock lock(mLock); return lookup(key).number(); } catch (ConfigurationTableKeyNotFound) { - syslog(LOG_NOTICE | mFacility, "deinfing missing parameter %s with value %ld", key.c_str(),defaultValue); + gLogEarly(LOG_NOTICE, "deinfing missing parameter %s with value %ld", key.c_str(),defaultValue); set(key,defaultValue); return defaultValue; } @@ -247,7 +247,7 @@ std::vector ConfigurationTable::getVectorOfStrings(const string& key) line = strdup(rec.value().c_str()); } catch (ConfigurationTableKeyNotFound) { // Raise an alert and re-throw the exception. - syslog(LOG_ALERT | mFacility, "configuration parameter %s has no defined value", key.c_str()); + gLogEarly(LOG_ALERT, "configuration parameter %s has no defined value", key.c_str()); throw ConfigurationTableKeyNotFound(key); } @@ -289,7 +289,7 @@ std::vector ConfigurationTable::getVector(const string& key) line = strdup(rec.value().c_str()); } catch (ConfigurationTableKeyNotFound) { // Raise an alert and re-throw the exception. - syslog(LOG_ALERT | mFacility, "configuration parameter %s has no defined value", key.c_str()); + gLogEarly(LOG_ALERT, "configuration parameter %s has no defined value", key.c_str()); throw ConfigurationTableKeyNotFound(key); } diff --git a/CommonLibs/Configuration.h b/CommonLibs/Configuration.h index 3377e6d5..bc37a498 100644 --- a/CommonLibs/Configuration.h +++ b/CommonLibs/Configuration.h @@ -33,7 +33,6 @@ #include #include -#include #include #include @@ -181,12 +180,11 @@ class ConfigurationTable { sqlite3* mDB; ///< database connection ConfigurationMap mCache; ///< cache of recently access configuration values mutable Mutex mLock; ///< control for multithreaded access to the cache - int mFacility; public: - ConfigurationTable(const char* filename = ":memory:", const char *wCmdName = 0, int wFacility = LOG_USER); + ConfigurationTable(const char* filename = ":memory:", const char *wCmdName = 0); /** Return true if the key is used in the table. */ bool defines(const std::string& key); diff --git a/CommonLibs/ConfigurationTest.cpp b/CommonLibs/ConfigurationTest.cpp index bff04e63..a21ea86b 100644 --- a/CommonLibs/ConfigurationTest.cpp +++ b/CommonLibs/ConfigurationTest.cpp @@ -32,7 +32,7 @@ using namespace std; -ConfigurationTable gConfig("exampleconfig.db","test",LOG_LOCAL7); +ConfigurationTable gConfig("exampleconfig.db","test"); void purgeConfig(void*,int,char const*, char const*, sqlite3_int64) { diff --git a/CommonLibs/Logger.cpp b/CommonLibs/Logger.cpp index d8bfc6e6..36b76965 100644 --- a/CommonLibs/Logger.cpp +++ b/CommonLibs/Logger.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "Configuration.h" #include "Logger.h" @@ -200,6 +201,13 @@ void gLogInit(const char* name, const char* level, int facility) } - +void gLogEarly(int level, const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + vsyslog(level | LOG_USER, fmt, args); + va_end(args); +} // vim: ts=4 sw=4 diff --git a/CommonLibs/Logger.h b/CommonLibs/Logger.h index 35101d81..0a9b535e 100644 --- a/CommonLibs/Logger.h +++ b/CommonLibs/Logger.h @@ -102,6 +102,8 @@ std::list gGetLoggerAlarms(); ///< Get a copy of the recent alarm void gLogInit(const char* name, const char* level=NULL, int facility=LOG_USER); /** Get the logging level associated with a given file. */ int gGetLoggingLevel(const char *filename=NULL); +/** Allow early logging when still in constructors */ +void gLogEarly(int level, const char *fmt, ...) __attribute__((format(printf, 2, 3))); //@}