Listing 9: C++ Logger implementation

void 
LoggerImpl::logMessage(MessageLevel level,const string& message)
{
   messages_[level].push_back(string(message));
   cout << levelDesc(level) << " " << message << endl;
}  // end LoggerImpl::logMessage(...

void LoggerImpl::logMessage(MessageLevel level,
                            const string& fileName,
                            long lineNumber,
                            const string& message)
{
   strstream s;
   s << fileName << ", line " << lineNumber 
     << ":  " << message << ends;

   messages_[level].push_back(string(s.str()));  // freezes s

   s.rdbuf()->freeze(0);  // unfreezes s

   cout << levelDesc(level) << " "
        << fileName << ", line " << lineNumber << ":  "
        << message << endl;
}  // end LoggerImpl::logMessage(...


void LoggerImpl::logMessage(MessageLevel level,
                            const string& className,
                            const string& methodName,
                            const string& message)
{
   messages_[level].push_back(string(className)
                              + string("::")
                              + string(methodName)
                              + string("():  ")
                              + string(message));
   cout << levelDesc(level) << " "
        << className << "::" << methodName << ":  "
        << message << endl;
}  // end LoggerImpl::logMessageAndMethod(...


vector<string,allocator> LoggerImpl::messages(MessageLevel level)
{
   vector<string,allocator> messages;

   if (messages_[level].size())
      for (vector<string,allocator>::iterator it 
         = messages_[level].begin();
           it != messages_[level].end();
           it++)
         messages.push_back(*it);

   return messages;
}  // end LoggerImpl::messages(...

— End of Listing —