Gaudi Framework, version v21r4

Home   Generated: 7 Sep 2009

MessageSvc Class Reference

#include <MessageSvc.h>

Inheritance diagram for MessageSvc:

Inheritance graph
[legend]
Collaboration diagram for MessageSvc:

Collaboration graph
[legend]

List of all members.


Detailed Description

Definition at line 31 of file MessageSvc.h.


Public Types

typedef std::pair< std::string,
std::ostream * > 
NamedStream
typedef std::multimap< int,
NamedStream
StreamMap
typedef std::multimap
< StatusCode, Message
MessageMap
typedef std::map< std::string,
int > 
ThresholdMap

Public Member Functions

 MessageSvc (const std::string &name, ISvcLocator *svcloc)
virtual ~MessageSvc ()
virtual StatusCode reinitialize ()
 Reinitialize Service.
virtual StatusCode initialize ()
 Initialize Service.
virtual StatusCode finalize ()
 Finalize Service.
virtual void reportMessage (const Message &message)
 Report a message by sending a Message object to the message service.
virtual void reportMessage (const Message &msg, int outputLevel)
 Report a message by sending a Message object to the message service.
virtual void reportMessage (const StatusCode &code, const std::string &source="")
 Report an error to the message service.
virtual void reportMessage (const char *source, int type, const char *message)
 Report a message by specifying the source, severity level and text.
virtual void reportMessage (const std::string &source, int type, const std::string &message)
 Report a message by specifying the source, severity level and text.
virtual void insertMessage (const StatusCode &code, const Message &message)
 Insert a message to be sent for a given status code into the error code repository.
virtual void eraseMessage ()
 Erase all messages associated to all status codes.
virtual void eraseMessage (const StatusCode &code)
 Erase message associated to a given status code.
virtual void eraseMessage (const StatusCode &code, const Message &message)
 Erase a given message associated to a given status code.
virtual void insertStream (int message_type, const std::string &name, std::ostream *stream)
 Add a new stream for a message type (severity level).
virtual void eraseStream ()
 Delete all the streams.
virtual void eraseStream (int message_type)
 Delete all the streams for a given message type (severity level).
virtual void eraseStream (int message_type, std::ostream *stream)
 Delete a single stream for a given message type (severity level).
virtual void eraseStream (std::ostream *stream)
 Delete all occurrences of a stream.
virtual std::ostreamdefaultStream () const
 Get the default stream.
virtual void setDefaultStream (std::ostream *stream)
 Set the default stream.
virtual int outputLevel () const
 get the Service's output level
virtual int outputLevel (const std::string &source) const
 Retrieve the current output level threshold for a given message source.
virtual void setOutputLevel (int new_level)
 Set new global output level threshold.
virtual void setOutputLevel (const std::string &source, int new_level)
 Set new output level threshold for a given message source.
virtual bool useColor () const
 Show whether colors are used.
virtual std::string getLogColor (int logLevel) const
 Get the color codes for various log levels.
virtual int messageCount (MSG::Level logLevel) const
 Get the number of messages issued at a particular level.

Private Types

typedef std::map< std::string,
MSG::Color
ColorMap
typedef std::map< std::string,
std::ostream * > 
LoggedStreamsMap_t

Private Member Functions

std::string colTrans (std::string, int)
void initColors (Property &prop)
void setupColors (Property &prop)
void setupLimits (Property &prop)
void setupThreshold (Property &prop)
void setupLogStreams ()
void tee (const std::string &sourceName, const std::string &logFileName, const std::set< std::string > &declaredOutFileNames)

Private Attributes

std::ostreamm_defaultStream
 Pointer to the output stream.
Message m_defaultMessage
 Default Message.
StreamMap m_streamMap
 Stream map.
MessageMap m_messageMap
 Message map.
ThresholdMap m_thresholdMap
 Output level threshold map.
std::string m_defaultFormat
 Default format for the messages.
std::string m_defaultTimeFormat
 Default format for timestamps in the messages.
StringArrayProperty m_thresholdProp [MSG::NUM_LEVELS]
 Properties controling.
BooleanProperty m_color
BooleanProperty m_stats
UnsignedIntegerProperty m_statLevel
StringArrayProperty m_logColors [MSG::NUM_LEVELS]
IntegerProperty m_msgLimit [MSG::NUM_LEVELS]
std::string m_logColorCodes [MSG::NUM_LEVELS]
std::map< std::string, msgArym_sourceMap
BooleanProperty m_suppress
ColorMap m_colMap
int m_msgCount [MSG::NUM_LEVELS]
std::map< std::string,
std::string
m_loggedStreamsName
LoggedStreamsMap_t m_loggedStreams
boost::recursive_mutex m_reportMutex
 Mutex to synchronize multiple threads printing.
boost::recursive_mutex m_messageMapMutex
 Mutex to synchronize multiple access to m_messageMap.
boost::recursive_mutex m_thresholdMapMutex
 Mutex to synchronize multiple access to m_thresholdMap (.

Classes

struct  msgAry

Member Typedef Documentation

Definition at line 33 of file MessageSvc.h.

Definition at line 34 of file MessageSvc.h.

Definition at line 35 of file MessageSvc.h.

Definition at line 36 of file MessageSvc.h.

Definition at line 148 of file MessageSvc.h.

Definition at line 154 of file MessageSvc.h.


Constructor & Destructor Documentation

MessageSvc::MessageSvc ( const std::string name,
ISvcLocator svcloc 
)

Definition at line 28 of file MessageSvc.cpp.

00029   : base_class( name, svcloc ) {
00030   m_defaultStream = &std::cout;
00031   m_outputLevel   = MSG::NIL;
00032   declareProperty( "Format",      m_defaultFormat = Message::getDefaultFormat() );
00033   declareProperty( "timeFormat",  m_defaultTimeFormat = Message::getDefaultTimeFormat() );
00034   declareProperty( "showStats",   m_stats = false );
00035   declareProperty( "statLevel",   m_statLevel = 0 );
00036 
00037   // Special properties to control output level of individual sources
00038   declareProperty( "setVerbose",  m_thresholdProp[MSG::VERBOSE] );
00039   declareProperty( "setDebug",    m_thresholdProp[MSG::DEBUG] );
00040   declareProperty( "setInfo",     m_thresholdProp[MSG::INFO] );
00041   declareProperty( "setWarning",  m_thresholdProp[MSG::WARNING] );
00042   declareProperty( "setError",    m_thresholdProp[MSG::ERROR] );
00043   declareProperty( "setFatal",    m_thresholdProp[MSG::FATAL] );
00044   declareProperty( "setAlways",   m_thresholdProp[MSG::ALWAYS] );
00045 
00046   declareProperty( "useColors",        m_color=false);
00047   m_color.declareUpdateHandler(&MessageSvc::initColors, this);
00048 
00049   declareProperty( "fatalColorCode",   m_logColors[MSG::FATAL] );
00050   declareProperty( "errorColorCode",   m_logColors[MSG::ERROR] );
00051   declareProperty( "warningColorCode", m_logColors[MSG::WARNING] );
00052   declareProperty( "infoColorCode",    m_logColors[MSG::INFO] );
00053   declareProperty( "debugColorCode",   m_logColors[MSG::DEBUG] );
00054   declareProperty( "verboseColorCode", m_logColors[MSG::VERBOSE] );
00055   declareProperty( "alwaysColorCode",  m_logColors[MSG::ALWAYS] );
00056 
00057   const int defaultLimit = 500;
00058   declareProperty( "fatalLimit",    m_msgLimit[MSG::FATAL]   = defaultLimit );
00059   declareProperty( "errorLimit",    m_msgLimit[MSG::ERROR]   = defaultLimit );
00060   declareProperty( "warningLimit",  m_msgLimit[MSG::WARNING] = defaultLimit );
00061   declareProperty( "infoLimit",     m_msgLimit[MSG::INFO]    = defaultLimit );
00062   declareProperty( "debugLimit",    m_msgLimit[MSG::DEBUG]   = defaultLimit );
00063   declareProperty( "verboseLimit",  m_msgLimit[MSG::VERBOSE] = defaultLimit );
00064   declareProperty( "alwaysLimit",   m_msgLimit[MSG::ALWAYS]  = 0 );
00065 
00066   declareProperty( "defaultLimit",  m_msgLimit[MSG::NIL]     = defaultLimit );
00067 
00068   declareProperty( "enableSuppression", m_suppress = false );
00069 
00070   declareProperty( "loggedStreams",
00071                    m_loggedStreamsName,
00072                    "MessageStream sources we want to dump into a logfile" );
00073 
00074   for (int ic=0; ic<MSG::NUM_LEVELS; ++ic) {
00075     m_logColors[ic].declareUpdateHandler(&MessageSvc::setupColors, this);
00076     m_msgLimit[ic].declareUpdateHandler(&MessageSvc::setupLimits, this);
00077     m_thresholdProp[ic].declareUpdateHandler(&MessageSvc::setupThreshold, this);
00078   }
00079 
00080   levelNames[0] = "NIL";
00081   levelNames[1] = "VERBOSE";
00082   levelNames[2] = "DEBUG";
00083   levelNames[3] = "INFO";
00084   levelNames[4] = "WARNING";
00085   levelNames[5] = "ERROR";
00086   levelNames[6] = "FATAL";
00087   levelNames[7] = "ALWAYS";
00088 
00089   for (int i=0; i<MSG::NUM_LEVELS; ++i) {
00090       m_msgCount[i] = 0;
00091   }
00092 
00093 }

MessageSvc::~MessageSvc (  )  [virtual]

Definition at line 97 of file MessageSvc.cpp.

00098 {
00099   // closing log-files, if any
00100   LoggedStreamsMap_t::iterator iStream   = m_loggedStreams.begin();
00101   LoggedStreamsMap_t::iterator endStream = m_loggedStreams.end();
00102   for ( ; iStream != endStream; ++iStream ) {
00103     delete iStream->second;
00104     iStream->second = 0;
00105   }
00106 }


Member Function Documentation

StatusCode MessageSvc::reinitialize (  )  [virtual]

Reinitialize Service.

Reimplemented from Service.

Definition at line 145 of file MessageSvc.cpp.

00145                                     {
00146   m_state = Gaudi::StateMachine::OFFLINE;
00147   return initialize();
00148 }

StatusCode MessageSvc::initialize (  )  [virtual]

Initialize Service.

Reimplemented from Service.

Definition at line 111 of file MessageSvc.cpp.

00111                                   {
00112   StatusCode sc;
00113   sc = Service::initialize();
00114   if( sc.isFailure() ) return sc;
00115   // Release pointer to myself done in Service base class
00116   //if( m_msgsvc.isValid() ) {
00117   //  m_msgsvc = 0;
00118   //}
00119   // Set my own properties
00120   sc = setProperties();
00121   if (sc.isFailure()) return sc;
00122 
00123 #ifdef _WIN32
00124   m_color = false;
00125 #endif
00126 
00127   m_colMap["black"]  = MSG::BLACK;
00128   m_colMap["red"]    = MSG::RED;
00129   m_colMap["green"]  = MSG::GREEN;
00130   m_colMap["yellow"] = MSG::YELLOW;
00131   m_colMap["blue"]   = MSG::BLUE;
00132   m_colMap["purple"] = MSG::PURPLE;
00133   m_colMap["cyan"]   = MSG::CYAN;
00134   m_colMap["white"]  = MSG::WHITE;
00135 
00136   // make sure the map of logged stream names is initialized
00137   setupLogStreams();
00138 
00139   return StatusCode::SUCCESS;
00140 }

StatusCode MessageSvc::finalize ( void   )  [virtual]

Finalize Service.

Reimplemented from Service.

Definition at line 323 of file MessageSvc.cpp.

00323                                 {
00324 
00325   m_suppress = false;
00326 
00327   std::ostringstream os;
00328 
00329   if (m_stats) {
00330     os << "Summarizing all message counts" << endl;
00331   } else {
00332     os << "Listing sources of suppressed message: " << endl;
00333   }
00334 
00335   os << "=====================================================" << endl;
00336   os << " Message Source              |   Level |    Count" << endl;
00337   os << "-----------------------------+---------+-------------" << endl;
00338 
00339 
00340   bool found(false);
00341 
00342   std::map<std::string,msgAry>::const_iterator itr;
00343   for (itr=m_sourceMap.begin(); itr!=m_sourceMap.end(); ++itr) {
00344     for (unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic) {
00345       if ( (itr->second.msg[ic] >= m_msgLimit[ic] && m_msgLimit[ic] != 0 ) ||
00346            (m_stats && itr->second.msg[ic] > 0 && ic >= m_statLevel.value()) ) {
00347         os << " ";
00348         os.width(28);
00349         os.setf(ios_base::left,ios_base::adjustfield);
00350         os << itr->first;
00351 
00352         os << "|";
00353 
00354         os.width(8);
00355         os.setf(ios_base::right,ios_base::adjustfield);
00356         os << levelNames[ic];
00357 
00358         os << " |";
00359 
00360         os.width(9);
00361         os << itr->second.msg[ic];
00362 
00363         os << endl;
00364 
00365         found = true;
00366       }
00367     }
00368   }
00369   os << "=====================================================" << endl;
00370 
00371   if (found || m_stats) {
00372     cout << os.str();
00373   }
00374 
00375   return StatusCode::SUCCESS;
00376 }

void MessageSvc::reportMessage ( const Message message  )  [virtual]

Report a message by sending a Message object to the message service.

Parameters:
message Reference to a message object

Implements IMessageSvc.

Definition at line 486 of file MessageSvc.cpp.

00486                                                       {
00487   reportMessage(msg, outputLevel(msg.getSource()));
00488 }

void MessageSvc::reportMessage ( const Message msg,
int  outputLevel 
) [virtual]

Report a message by sending a Message object to the message service.

Parameters:
message Reference to a message object
outputLevel Output level of the message source for this message

Implements IMessageSvc.

Definition at line 402 of file MessageSvc.cpp.

00402                                                                        {
00403   boost::recursive_mutex::scoped_lock lock(m_reportMutex);
00404 
00405   int key = msg.getType();
00406   int nmsg;
00407 
00408   m_msgCount[key] ++;
00409 
00410   const Message *cmsg = &msg;
00411 
00412   // processing logged streams
00413   if ( !m_loggedStreams.empty() ) {
00414     const LoggedStreamsMap_t::iterator iLog = m_loggedStreams.find( msg.getSource() );
00415     if ( m_loggedStreams.end() != iLog ) {
00416       (*iLog->second) << *cmsg << std::endl;
00417     }
00418   }
00419 
00420   if ( m_suppress.value() || m_stats.value() ) {
00421 
00422     std::map<std::string,msgAry>::iterator itr =
00423       m_sourceMap.find(msg.getSource());
00424     if (itr != m_sourceMap.end()) {
00425       itr->second.msg[key] += 1;
00426       nmsg = itr->second.msg[key];
00427     } else {
00428       msgAry A;
00429       for (int i=0; i<MSG::NUM_LEVELS; ++i) {
00430         A.msg[i] = 0;
00431       }
00432       A.msg[key] = 1;
00433       m_sourceMap[msg.getSource()] = A;
00434       nmsg = 1;
00435     }
00436 
00437     if (m_suppress.value()) {
00438 
00439       if ( m_msgLimit[key] != 0 ) {
00440         if (nmsg == m_msgLimit[key]) {
00441           char lim[16];
00442           std::string str = levelNames[key] + " message limit (";
00443           str += ::_itoa(m_msgLimit[key].value(),lim,10);
00444           str += ") reached for ";
00445           str += msg.getSource() + ". Suppressing further output.";
00446           cmsg = new Message(msg.getSource(),MSG::WARNING,str);
00447           cmsg->setFormat(msg.getFormat());
00448         } else if (nmsg > m_msgLimit[key]) {
00449           return;
00450         }
00451       }
00452     }
00453 
00454   }
00455 
00456   StreamMap::const_iterator first = m_streamMap.lower_bound( key );
00457   if ( first != m_streamMap.end() ) {
00458     StreamMap::const_iterator last = m_streamMap.upper_bound( key );
00459     while( first != last ) {
00460       std::ostream& stream = *( (*first).second.second );
00461       stream << *cmsg << std::endl;
00462       first++;
00463     }
00464   }
00465   else if ( key >= outputLevel )   {
00466     msg.setFormat(m_defaultFormat);
00467     msg.setTimeFormat(m_defaultTimeFormat);
00468     if (!m_color) {
00469       (*m_defaultStream) << *cmsg << std::endl << std::flush;
00470     } else {
00471       (*m_defaultStream) <<  m_logColorCodes[key] << *cmsg << "\033[m"
00472                          << std::endl << std::flush;
00473     }
00474   }
00475 
00476   if (cmsg != &msg) { delete cmsg; }
00477 
00478 }

void MessageSvc::reportMessage ( const StatusCode code,
const std::string source = "" 
) [virtual]

Report an error to the message service.

The service will use the error code number for formating a human readable message

Parameters:
code Error code number
source Message source. Typically the alg/svc name

Implements IMessageSvc.

Definition at line 523 of file MessageSvc.cpp.

00525 {
00526   boost::recursive_mutex::scoped_lock lock(m_messageMapMutex);
00527 
00528   MessageMap::const_iterator first = m_messageMap.lower_bound( key );
00529   if ( first != m_messageMap.end() ) {
00530     MessageMap::const_iterator last = m_messageMap.upper_bound( key );
00531     while( first != last ) {
00532       Message msg = (*first).second;
00533       msg.setSource( source );
00534       std::ostringstream os1;
00535       os1 << "Status Code " << key.getCode() << std::ends;
00536       Message stat_code1( source, msg.getType(), os1.str() );
00537       reportMessage( stat_code1 );
00538       reportMessage( msg );
00539       first++;
00540     }
00541   }
00542   else {
00543     Message mesg = m_defaultMessage;
00544     mesg.setSource( source );
00545       std::ostringstream os2;
00546     os2 << "Status Code " << key.getCode() << std::ends;
00547     Message stat_code2( source,  mesg.getType(), os2.str() );
00548     reportMessage( stat_code2 );
00549     reportMessage( mesg );
00550   }
00551 }

void MessageSvc::reportMessage ( const char *  source,
int  type,
const char *  message 
) [virtual]

Report a message by specifying the source, severity level and text.

The text is passed as C like character string to avoid extra copying.

Parameters:
source Message source. Typically the alg/svc name
type Severity level
message Text message

Implements IMessageSvc.

Definition at line 496 of file MessageSvc.cpp.

00498                                                      {
00499   Message msg( source, type, message);
00500   reportMessage( msg );
00501 }

void MessageSvc::reportMessage ( const std::string source,
int  type,
const std::string message 
) [virtual]

Report a message by specifying the source, severity level and text.

Parameters:
source Message source. Typically the alg/svc name
type Severity level
message Text message

Implements IMessageSvc.

Definition at line 509 of file MessageSvc.cpp.

00511                                                           {
00512   Message msg( source, type, message);
00513   reportMessage( msg );
00514 }

void MessageSvc::insertMessage ( const StatusCode code,
const Message message 
) [virtual]

Insert a message to be sent for a given status code into the error code repository.

Parameters:
code Status error code
message Message associated

Implements IMessageSvc.

Definition at line 649 of file MessageSvc.cpp.

00650 {
00651   boost::recursive_mutex::scoped_lock lock(m_messageMapMutex);
00652 
00653   typedef MessageMap::value_type value_type;
00654   m_messageMap.insert( value_type( key, msg ) );
00655 }

void MessageSvc::eraseMessage (  )  [virtual]

Erase all messages associated to all status codes.

Implements IMessageSvc.

Definition at line 664 of file MessageSvc.cpp.

00665 {
00666   boost::recursive_mutex::scoped_lock lock(m_messageMapMutex);
00667 
00668   m_messageMap.erase( m_messageMap.begin(), m_messageMap.end() );
00669 }

void MessageSvc::eraseMessage ( const StatusCode code  )  [virtual]

Erase message associated to a given status code.

Implements IMessageSvc.

Definition at line 678 of file MessageSvc.cpp.

00679 {
00680   boost::recursive_mutex::scoped_lock lock(m_messageMapMutex);
00681 
00682   m_messageMap.erase( key );
00683 }

void MessageSvc::eraseMessage ( const StatusCode code,
const Message message 
) [virtual]

Erase a given message associated to a given status code.

Parameters:
code Status error code
message Message associated

Implements IMessageSvc.

Definition at line 692 of file MessageSvc.cpp.

00693 {
00694   boost::recursive_mutex::scoped_lock lock(m_messageMapMutex);
00695 
00696   bool changed = true;
00697   while( changed ) {
00698     changed = false;
00699     MessageMap::iterator first = m_messageMap.lower_bound( key );
00700     MessageMap::iterator last = m_messageMap.upper_bound( key );
00701     while( first != last ) {
00702       const Message& message = (*first).second;
00703       if ( message == msg ) {
00704         m_messageMap.erase( first );
00705         changed = true;
00706         break;
00707       }
00708     }
00709   }
00710 }

void MessageSvc::insertStream ( int  type,
const std::string name,
std::ostream stream 
) [virtual]

Add a new stream for a message type (severity level).

Parameters:
type Severity level
name Stream name
stream Pointer to a C++ stream

Implements IMessageSvc.

Definition at line 560 of file MessageSvc.cpp.

00563 {
00564   typedef StreamMap::value_type value_type;
00565   m_streamMap.insert( value_type( key, NamedStream(name,stream) ) );
00566 }

void MessageSvc::eraseStream (  )  [virtual]

Delete all the streams.

Implements IMessageSvc.

Definition at line 575 of file MessageSvc.cpp.

00576 {
00577   m_streamMap.erase( m_streamMap.begin(), m_streamMap.end() );
00578 }

void MessageSvc::eraseStream ( int  message_type  )  [virtual]

Delete all the streams for a given message type (severity level).

Implements IMessageSvc.

Definition at line 587 of file MessageSvc.cpp.

00588 {
00589   m_streamMap.erase( message_type );
00590 }

void MessageSvc::eraseStream ( int  type,
std::ostream stream 
) [virtual]

Delete a single stream for a given message type (severity level).

Parameters:
type Severity level
stream Pointer to a C++ stream

Implements IMessageSvc.

Definition at line 599 of file MessageSvc.cpp.

00599                                                             {
00600   if ( 0 != stream )    {
00601     bool changed = true;
00602     while( changed ) {
00603       changed = false;
00604       StreamMap::iterator first = m_streamMap.lower_bound( key );
00605       StreamMap::iterator last = m_streamMap.upper_bound( key );
00606       while( first != last ) {
00607         if ( (*first).second.second == stream ) {
00608           m_streamMap.erase( first );
00609           changed = true;
00610           break;
00611         }
00612       }
00613     }
00614   }
00615 }

void MessageSvc::eraseStream ( std::ostream stream  )  [virtual]

Delete all occurrences of a stream.

Parameters:
stream Pointer to a C++ stream

Implements IMessageSvc.

Definition at line 624 of file MessageSvc.cpp.

00624                                                     {
00625   if ( 0 != stream )    {
00626     bool changed = true;
00627     while( changed ) {
00628       changed = false;
00629       StreamMap::iterator first = m_streamMap.begin();
00630       while( first != m_streamMap.end() ) {
00631         if ( (*first).second.second == stream ) {
00632           m_streamMap.erase( first );
00633           changed = true;
00634           break;
00635         }
00636       }
00637     }
00638   }
00639 }

virtual std::ostream* MessageSvc::defaultStream (  )  const [inline, virtual]

Get the default stream.

Implements IMessageSvc.

Definition at line 93 of file MessageSvc.h.

00093                                             {
00094     return m_defaultStream;
00095   }

virtual void MessageSvc::setDefaultStream ( std::ostream stream  )  [inline, virtual]

Set the default stream.

Parameters:
stream Pointer to a C++ stream

Implements IMessageSvc.

Definition at line 98 of file MessageSvc.h.

00098                                                       {
00099     boost::recursive_mutex::scoped_lock lock(m_reportMutex);
00100     m_defaultStream = stream;
00101   }

int MessageSvc::outputLevel (  )  const [virtual]

get the Service's output level

Reimplemented from Service.

Definition at line 713 of file MessageSvc.cpp.

00713                                     {
00714 // ---------------------------------------------------------------------------
00715   return m_outputLevel;
00716 }

int MessageSvc::outputLevel ( const std::string source  )  const [virtual]

Retrieve the current output level threshold for a given message source.

Parameters:
source Message source. Typically the alg/svc name

Implements IMessageSvc.

Definition at line 719 of file MessageSvc.cpp.

00719                                                              {
00720 // ---------------------------------------------------------------------------
00721   boost::recursive_mutex::scoped_lock lock(m_thresholdMapMutex);
00722 
00723   ThresholdMap::const_iterator it;
00724 
00725   it = m_thresholdMap.find( source );
00726   if( it != m_thresholdMap.end() ) {
00727     return (*it).second;
00728   }
00729   else {
00730     return m_outputLevel;
00731   }
00732 }

void MessageSvc::setOutputLevel ( int  new_level  )  [virtual]

Set new global output level threshold.

Implements IMessageSvc.

Definition at line 735 of file MessageSvc.cpp.

00735                                                 {
00736 // ---------------------------------------------------------------------------
00737   m_outputLevel = new_level;
00738 }

void MessageSvc::setOutputLevel ( const std::string source,
int  new_level 
) [virtual]

Set new output level threshold for a given message source.

Parameters:
source Message source
new_level Severity level

Implements IMessageSvc.

Definition at line 741 of file MessageSvc.cpp.

00741                                                                      {
00742 // ---------------------------------------------------------------------------
00743   boost::recursive_mutex::scoped_lock lock(m_thresholdMapMutex);
00744 
00745   /*
00746   std::pair<ThresholdMap::iterator, bool> p;
00747   p = m_thresholdMap.insert(ThresholdMap::value_type( source, level) );
00748   if( p.second == false ) {
00749     // Already esisting an output level for that source. Erase and enter it again
00750     m_thresholdMap.erase ( p.first );
00751     m_thresholdMap.insert(ThresholdMap::value_type( source, level) );
00752   }
00753   */
00754   m_thresholdMap[source] = level;
00755 }

virtual bool MessageSvc::useColor (  )  const [inline, virtual]

Show whether colors are used.

Implements IMessageSvc.

Definition at line 116 of file MessageSvc.h.

00116 { return m_color; }

std::string MessageSvc::getLogColor ( int  logLevel  )  const [virtual]

Get the color codes for various log levels.

Parameters:
logLevel Logging level

Implements IMessageSvc.

Definition at line 758 of file MessageSvc.cpp.

00758                                                       {
00759 // ---------------------------------------------------------------------------
00760   if (logLevel < MSG::NUM_LEVELS) {
00761     return m_logColorCodes[logLevel];
00762   } else {
00763     return "";
00764   }
00765 }

int MessageSvc::messageCount ( MSG::Level  level  )  const [virtual]

Get the number of messages issued at a particular level.

Implements IMessageSvc.

Definition at line 768 of file MessageSvc.cpp.

00768                                                     {
00769 
00770   return m_msgCount[level];
00771 
00772 }

std::string MessageSvc::colTrans ( std::string  col,
int  offset 
) [private]

Definition at line 379 of file MessageSvc.cpp.

00379                                                         {
00380   ColorMap::const_iterator itr = m_colMap.find(col);
00381   int icol;
00382   if (itr != m_colMap.end()) {
00383     icol = offset + itr->second;
00384   } else {
00385     icol = offset + 8;
00386   }
00387   std::ostringstream os1;
00388 
00389   os1 << icol;
00390 
00391   return os1.str();
00392 
00393 }

void MessageSvc::initColors ( Property prop  )  [private]

Definition at line 152 of file MessageSvc.cpp.

00152                                               {
00153 
00154   if (m_color == true) {
00155 
00156     if (m_logColors[MSG::FATAL].value().size() == 0) {
00157       vector<string> fatDef;
00158       fatDef.push_back( "[94;101;1m" );
00159       m_logColors[MSG::FATAL].set( fatDef );
00160     } else {
00161       MessageSvc::setupColors( m_logColors[MSG::FATAL] );
00162     }
00163 
00164     if (m_logColors[MSG::ERROR].value().size() == 0) {
00165       vector<string> errDef;
00166       errDef.push_back( "[97;101;1m" );
00167       m_logColors[MSG::ERROR].set( errDef );
00168     } else {
00169       MessageSvc::setupColors( m_logColors[MSG::ERROR] );
00170     }
00171 
00172     if (m_logColors[MSG::WARNING].value().size() == 0) {
00173       vector<string> warDef;
00174       warDef.push_back( "[93;1m" );
00175       m_logColors[MSG::WARNING].set( warDef );
00176     } else {
00177       MessageSvc::setupColors( m_logColors[MSG::WARNING] );
00178     }
00179 
00180   } else {
00181 
00182     // reset all color codes;
00183     for (int ic=0; ic<MSG::NUM_LEVELS; ++ic) {
00184       vector<string> def;
00185       m_logColors[ic].set( def );
00186     }
00187 
00188   }
00189 
00190 }

void MessageSvc::setupColors ( Property prop  )  [private]

Definition at line 194 of file MessageSvc.cpp.

00194                                            {
00195 
00196   if (! m_color) return;
00197 
00198   int ic;
00199   if (prop.name() == "fatalColorCode") {
00200     ic = MSG::FATAL;
00201   } else if (prop.name() == "errorColorCode") {
00202     ic = MSG::ERROR;
00203   } else if (prop.name() == "warningColorCode") {
00204     ic = MSG::WARNING;
00205   } else if (prop.name() == "infoColorCode") {
00206     ic = MSG::INFO;
00207   } else if (prop.name() == "debugColorCode") {
00208     ic = MSG::DEBUG;
00209   } else if (prop.name() == "verboseColorCode") {
00210     ic = MSG::VERBOSE;
00211   } else if (prop.name() == "alwaysColorCode") {
00212     ic = MSG::ALWAYS;
00213   } else {
00214     cout << "ERROR: Unknown message color parameter: " << prop.name()
00215          << endl;
00216     return;
00217   }
00218 
00219   string code;
00220   vector<string>::const_iterator itr;
00221   itr = m_logColors[ic].value().begin();
00222 
00223   if ( m_logColors[ic].value().size() == 1 ) {
00224 
00225     if (*itr == "") {
00226       code = "";
00227     } else if (itr->substr(0,1) == "[") {
00228       code = "\033" + *itr;
00229     } else {
00230       code = "\033[" + colTrans(*itr, 90) + ";1m";
00231     }
00232 
00233   } else if (m_logColors[ic].value().size() == 2) {
00234     vector<string>::const_iterator itr2 = itr + 1;
00235 
00236     code =  "\033[" + colTrans(*itr, 90) + ";"
00237       + colTrans(*itr2, 100) + ";1m";
00238 
00239   }
00240 
00241   m_logColorCodes[ic] = code;
00242 
00243 }

void MessageSvc::setupLimits ( Property prop  )  [private]

Definition at line 246 of file MessageSvc.cpp.

00246                                            {
00247 
00248   int ic = 0;
00249   if (prop.name() == "fatalLimit") {
00250     ic = MSG::FATAL;
00251   } else if (prop.name() == "errorLimit") {
00252     ic = MSG::ERROR;
00253   } else if (prop.name() == "warningLimit") {
00254     ic = MSG::WARNING;
00255   } else if (prop.name() == "infoLimit") {
00256     ic = MSG::INFO;
00257   } else if (prop.name() == "debugLimit") {
00258     ic = MSG::DEBUG;
00259   } else if (prop.name() == "verboseLimit") {
00260     ic = MSG::VERBOSE;
00261   } else if (prop.name() == "alwaysLimit") {
00262     IntegerProperty *p = dynamic_cast<IntegerProperty*>(&prop);
00263     if (p && p->value() != 0) {
00264       cout << "MessageSvc ERROR: cannot suppress ALWAYS messages" << endl;
00265       p->setValue(0);
00266     }
00267     ic = MSG::ALWAYS;
00268   } else if (prop.name() == "defaultLimit") {
00269     for (int i = MSG::VERBOSE; i< MSG::NUM_LEVELS; ++i) {
00270       if (i != MSG::ALWAYS) {
00271         m_msgLimit[i] = m_msgLimit[MSG::NIL].value();
00272       }
00273     }
00274   } else {
00275     cout << "MessageSvc ERROR: Unknown message limit parameter: "
00276          << prop.name() << endl;
00277     return;
00278   }
00279 
00280 }

void MessageSvc::setupThreshold ( Property prop  )  [private]

Definition at line 283 of file MessageSvc.cpp.

00283                                               {
00284 
00285   int ic = 0;
00286   if (prop.name() == "setFatal") {
00287     ic = MSG::FATAL;
00288   } else if (prop.name() == "setError") {
00289     ic = MSG::ERROR;
00290   } else if (prop.name() == "setWarning") {
00291     ic = MSG::WARNING;
00292   } else if (prop.name() == "setInfo") {
00293     ic = MSG::INFO;
00294   } else if (prop.name() == "setDebug") {
00295     ic = MSG::DEBUG;
00296   } else if (prop.name() == "setVerbose") {
00297     ic = MSG::VERBOSE;
00298   } else if (prop.name() == "setAlways") {
00299     ic = MSG::ALWAYS;
00300   } else {
00301     cerr << "MessageSvc ERROR: Unknown message threshold parameter: "
00302          << prop.name() << endl;
00303     return;
00304   }
00305 
00306   StringArrayProperty *sap = dynamic_cast<StringArrayProperty*>( &prop);
00307   if (sap == 0) {
00308     std::cerr << "could not dcast " << prop.name()
00309               << " to a StringArrayProperty (which it should be!)" << endl;
00310     return;
00311   } else {
00312     std::vector<std::string>::const_iterator itr;
00313     for ( itr =  sap->value().begin();
00314           itr != sap->value().end();
00315           ++itr) {
00316       setOutputLevel( *itr, ic );
00317     }
00318   }
00319 
00320 }

void MessageSvc::setupLogStreams (  )  [private]

Definition at line 775 of file MessageSvc.cpp.

00776 {
00777   // reset state
00778   for ( LoggedStreamsMap_t::iterator iLog = m_loggedStreams.begin();
00779         iLog != m_loggedStreams.end();
00780         ++iLog ) {
00781     delete iLog->second;
00782   }
00783   m_loggedStreams.clear();
00784 
00785   typedef std::map<std::string,std::string> StreamMap_t;
00786   const StreamMap_t& streamMap = m_loggedStreamsName;
00787   typedef StreamMap_t::const_iterator StreamMapIter;
00788 
00789   for ( StreamMapIter iProp = streamMap.begin(), iEnd = streamMap.end();
00790         iProp != iEnd;
00791         ++iProp ) {
00792 
00793     const std::string sourceName  = iProp->first;
00794     const std::string outFileName = iProp->second;
00795 
00796     std::set<std::string> outFileNames;
00797     for ( StreamMapIter jProp = streamMap.begin();
00798           jProp != iEnd;
00799           ++jProp ) {
00800       if ( jProp->first != iProp->first ) {
00801         outFileNames.insert( jProp->second );
00802       }
00803     }
00804 
00805     tee( sourceName, outFileName, outFileNames );
00806 
00807   }//> loop over property entries
00808 
00809   return;
00810 }

void MessageSvc::tee ( const std::string sourceName,
const std::string logFileName,
const std::set< std::string > &  declaredOutFileNames 
) [private]

Definition at line 813 of file MessageSvc.cpp.

00816 {
00817   const std::ios_base::openmode openMode = std::ios_base::out |
00818                                            std::ios_base::trunc;
00819 
00820   LoggedStreamsMap_t::iterator iEnd    = m_loggedStreams.end();
00821   LoggedStreamsMap_t::iterator iStream = m_loggedStreams.find( sourceName );
00822   if ( iStream != iEnd ) {
00823     delete iStream->second;
00824     iStream->second = 0;
00825     m_loggedStreams.erase( iStream );
00826   }
00827 
00828   // before creating a new ofstream, make sure there is no already existing
00829   // one with the same file name...
00830   iEnd = m_loggedStreams.end();
00831   for ( iStream = m_loggedStreams.begin(); iStream != iEnd; ++iStream ) {
00832     if ( outFileNames.find( outFileName ) != outFileNames.end() ) {
00833       m_loggedStreams[sourceName] = m_loggedStreams[iStream->first];
00834       return;
00835     }
00836   }
00837 
00838   std::ofstream * out =  new std::ofstream( outFileName.c_str(), openMode );
00839 
00840   if ( !out->good() ) {
00841     out->close();
00842     delete out;
00843     return;
00844   }
00845 
00846   m_loggedStreams[sourceName] = out;
00847 
00848   return;
00849 }


Member Data Documentation

Pointer to the output stream.

Definition at line 125 of file MessageSvc.h.

Default Message.

Definition at line 126 of file MessageSvc.h.

Stream map.

Definition at line 127 of file MessageSvc.h.

Message map.

Definition at line 128 of file MessageSvc.h.

Output level threshold map.

Definition at line 129 of file MessageSvc.h.

Default format for the messages.

Definition at line 130 of file MessageSvc.h.

Default format for timestamps in the messages.

Definition at line 131 of file MessageSvc.h.

Properties controling.

Definition at line 132 of file MessageSvc.h.

Definition at line 133 of file MessageSvc.h.

Definition at line 134 of file MessageSvc.h.

Definition at line 135 of file MessageSvc.h.

StringArrayProperty MessageSvc::m_logColors[MSG::NUM_LEVELS] [private]

Definition at line 136 of file MessageSvc.h.

IntegerProperty MessageSvc::m_msgLimit[MSG::NUM_LEVELS] [private]

Definition at line 137 of file MessageSvc.h.

std::string MessageSvc::m_logColorCodes[MSG::NUM_LEVELS] [private]

Definition at line 139 of file MessageSvc.h.

Definition at line 144 of file MessageSvc.h.

Definition at line 145 of file MessageSvc.h.

Definition at line 149 of file MessageSvc.h.

int MessageSvc::m_msgCount[MSG::NUM_LEVELS] [private]

Definition at line 151 of file MessageSvc.h.

Definition at line 153 of file MessageSvc.h.

Definition at line 155 of file MessageSvc.h.

boost::recursive_mutex MessageSvc::m_reportMutex [mutable, private]

Mutex to synchronize multiple threads printing.

Definition at line 168 of file MessageSvc.h.

boost::recursive_mutex MessageSvc::m_messageMapMutex [mutable, private]

Mutex to synchronize multiple access to m_messageMap.

Definition at line 171 of file MessageSvc.h.

boost::recursive_mutex MessageSvc::m_thresholdMapMutex [mutable, private]

Mutex to synchronize multiple access to m_thresholdMap (.

See also:
MsgStream::doOutput).

Definition at line 175 of file MessageSvc.h.


The documentation for this class was generated from the following files:

Generated at Mon Sep 7 18:20:47 2009 for Gaudi Framework, version v21r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004