From: Mukund Sivaraman Date: Wed, 23 May 2012 08:45:47 +0000 (+0530) Subject: [1704] Use LoggerImpl as a testcase for InterprocessSync X-Git-Tag: trac2351_base~226^2~60^2^2~67 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=106ec83cb515ddcc84834ba336dc39679377a8fd;p=thirdparty%2Fkea.git [1704] Use LoggerImpl as a testcase for InterprocessSync --- diff --git a/src/lib/log/logger_impl.cc b/src/lib/log/logger_impl.cc index 046da13c86..c73503315c 100644 --- a/src/lib/log/logger_impl.cc +++ b/src/lib/log/logger_impl.cc @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -38,6 +39,7 @@ // namespace: instead, all log4cplus types are explicitly qualified. using namespace std; +using namespace isc::util; namespace isc { namespace log { @@ -50,11 +52,13 @@ namespace log { LoggerImpl::LoggerImpl(const string& name) : name_(expandLoggerName(name)), logger_(log4cplus::Logger::getInstance(name_)) { + sync_ = new InterprocessSyncFile("logger"); } // Destructor. (Here because of virtual declaration.) LoggerImpl::~LoggerImpl() { + delete sync_; } // Set the severity for logging. @@ -104,6 +108,15 @@ LoggerImpl::lookupMessage(const MessageID& ident) { void LoggerImpl::outputRaw(const Severity& severity, const string& message) { + // Use a lock file for mutual exclusion from other processes to + // avoid log messages getting interspersed + + auto_ptr locker(sync_->getLocker()); + + if (!locker->lock()) { + LOG4CPLUS_ERROR(logger_, "Unable to lock logger lockfile"); + } + switch (severity) { case DEBUG: LOG4CPLUS_DEBUG(logger_, message); @@ -124,6 +137,10 @@ LoggerImpl::outputRaw(const Severity& severity, const string& message) { case FATAL: LOG4CPLUS_FATAL(logger_, message); } + + if (!locker->unlock()) { + LOG4CPLUS_ERROR(logger_, "Unable to unlock logger lockfile"); + } } } // namespace log diff --git a/src/lib/log/logger_impl.h b/src/lib/log/logger_impl.h index 90bd41a573..bad15ba59c 100644 --- a/src/lib/log/logger_impl.h +++ b/src/lib/log/logger_impl.h @@ -32,6 +32,8 @@ #include #include +#include + namespace isc { namespace log { @@ -178,8 +180,9 @@ public: } private: - std::string name_; ///< Full name of this logger - log4cplus::Logger logger_; ///< Underlying log4cplus logger + std::string name_; ///< Full name of this logger + log4cplus::Logger logger_; ///< Underlying log4cplus logger + isc::util::InterprocessSync* sync_; }; } // namespace log