The Gaudi Framework  v36r1 (3e2fb5a8)
MessageSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #ifdef _WIN32
12 // Avoid conflicts between windows and the message service.
13 # define NOMSG
14 # define NOGDI
15 #endif
16 
17 #include "MessageSvc.h"
18 #include "GaudiKernel/IAppMgrUI.h"
19 #include "GaudiKernel/Kernel.h"
20 #include "GaudiKernel/Message.h"
21 #include "GaudiKernel/StatusCode.h"
22 #include "GaudiKernel/System.h"
23 
24 #include <fstream>
25 #include <iostream>
26 #include <sstream>
27 
28 namespace {
29 
30  // erase_if functions for containers which do NOT invalidate iterators
31  // after the erase point, eg.std::{unordered_}{,multi}map, std::{forward_,}list.
32  // To be explicit: this does NOT work with std::vector.
33 
34  // TODO: replace with std::experimental::erase_if (Libraries Fundamental TS v2)
35 
36  template <typename Container, typename Iterator, typename Predicate>
37  void erase_if( Container& c, Iterator first, Iterator last, Predicate pred ) {
38  while ( first != last ) {
39  if ( pred( *first ) )
40  first = c.erase( first );
41  else
42  ++first;
43  }
44  }
45 
46  template <typename Container, typename Predicate>
47  void erase_if( Container& c, Predicate pred ) {
48  return erase_if( c, std::begin( c ), std::end( c ), std::forward<Predicate>( pred ) );
49  }
50 
51  template <typename Container, typename Iterator, typename Predicate>
52  void erase_if( Container& c, std::pair<Iterator, Iterator> range, Predicate pred ) {
53  return erase_if( c, std::move( range.first ), std::move( range.second ), std::forward<Predicate>( pred ) );
54  }
55 
56  std::string colTrans( std::string_view col, int offset ) {
57  int icol =
58  ( col == "black"
59  ? MSG::BLACK
60  : col == "red"
61  ? MSG::RED
62  : col == "green"
63  ? MSG::GREEN
64  : col == "yellow"
65  ? MSG::YELLOW
66  : col == "blue"
67  ? MSG::BLUE
68  : col == "purple" ? MSG::PURPLE
69  : col == "cyan" ? MSG::CYAN : col == "white" ? MSG::WHITE : 8 );
70  return std::to_string( icol + offset );
71  }
72 } // namespace
73 
74 // Instantiation of a static factory class used by clients to create
75 // instances of this service
77 
78 static const std::string levelNames[MSG::NUM_LEVELS] = {"NIL", "VERBOSE", "DEBUG", "INFO",
79  "WARNING", "ERROR", "FATAL", "ALWAYS"};
80 
81 // Constructor
83 
85  SmartIF<IAppMgrUI> app = svcloc;
86  if ( app ) app->outputLevelUpdate();
87  } );
88 
89 #ifndef NDEBUG
90  // initialize the MsgStream static flag.
92 #endif
93 
94  for ( int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
95  m_logColors[ic].declareUpdateHandler( &MessageSvc::setupColors, this );
96  m_msgLimit[ic].declareUpdateHandler( &MessageSvc::setupLimits, this );
97  m_thresholdProp[ic].declareUpdateHandler( &MessageSvc::setupThreshold, this );
98  }
99 
100  m_logColors[MSG::FATAL].set( {"blue", "red"} );
101  m_logColors[MSG::ERROR].set( {"white", "red"} );
102  m_logColors[MSG::WARNING].set( {"yellow"} );
103 
105 }
106 
107 //#############################################################################
108 
112  if ( sc.isFailure() ) return sc;
113 
114 #ifdef _WIN32
115  m_color = false;
116 #endif
117 
118  // make sure the map of logged stream names is initialized
119  setupLogStreams();
120 
121  return StatusCode::SUCCESS;
122 }
123 
124 //#############################################################################
125 
129  StatusCode sc = initialize();
131 
132  return sc;
133 }
134 
135 //#############################################################################
136 
138  const auto& pname = prop.name();
139  int level = ( pname == "fatalColorCode"
140  ? MSG::FATAL
141  : pname == "errorColorCode"
142  ? MSG::ERROR
143  : pname == "warningColorCode"
144  ? MSG::WARNING
145  : pname == "infoColorCode"
146  ? MSG::INFO
147  : pname == "debugColorCode"
148  ? MSG::DEBUG
149  : pname == "verboseColorCode"
150  ? MSG::VERBOSE
151  : pname == "alwaysColorCode"
152  ? MSG::ALWAYS
153  : ( throw GaudiException(
154  "ERROR: Unknown message color parameter: " + pname,
156  -1 ) );
157 
158  auto& code = m_logColorCodes[level];
159 
160  const auto& col_desc = m_logColors[level].value();
161 
162  if ( col_desc.size() == 1 ) {
163  const std::string& desc = col_desc[0];
164  if ( desc.empty() ) {
165  code = "";
166  } else if ( desc[0] == '[' ) {
167  code = "\033" + desc;
168  } else {
169  code = "\033[" + colTrans( desc, 90 ) + ";1m";
170  }
171  } else if ( col_desc.size() == 2 ) {
172  code = "\033[" + colTrans( col_desc[0], 90 ) + ";" + colTrans( col_desc[1], 100 ) + ";1m";
173  } else { // empty desc: no color
174  code = "";
175  }
176 }
177 //#############################################################################
178 
180  // Just report problems in the settings of the limits and unknown limit parameters
181  if ( prop.name() == "alwaysLimit" ) {
182  Gaudi::Property<int>* p = dynamic_cast<Gaudi::Property<int>*>( &prop );
183  if ( p && p->value() != 0 ) {
184  std::cout << "MessageSvc ERROR: cannot suppress ALWAYS messages" << std::endl;
185  p->setValue( 0 );
186  }
187  } else if ( prop.name() == "defaultLimit" ) {
188  for ( int i = MSG::VERBOSE; i < MSG::NUM_LEVELS; ++i ) {
189  if ( i != MSG::ALWAYS ) { m_msgLimit[i] = m_msgLimit[MSG::NIL].value(); }
190  }
191  } else if ( prop.name() != "fatalLimit" && prop.name() != "errorLimit" && prop.name() != "warningLimit" &&
192  prop.name() == "infoLimit" && prop.name() == "debugLimit" && prop.name() == "verboseLimit" ) {
193  std::cout << "MessageSvc ERROR: Unknown message limit parameter: " << prop.name() << std::endl;
194  return;
195  }
196 }
197 //#############################################################################
198 
200 
201  static const std::array<std::pair<const char*, MSG::Level>, 7> tbl{{{"setFatal", MSG::FATAL},
202  {"setError", MSG::ERROR},
203  {"setWarning", MSG::WARNING},
204  {"setInfo", MSG::INFO},
205  {"setDebug", MSG::DEBUG},
206  {"setVerbose", MSG::VERBOSE},
207  {"setAlways", MSG::ALWAYS}}};
208 
209  auto i = std::find_if( std::begin( tbl ), std::end( tbl ),
210  [&]( const std::pair<const char*, MSG::Level>& t ) { return prop.name() == t.first; } );
211  if ( i == std::end( tbl ) ) {
212  std::cerr << "MessageSvc ERROR: Unknown message threshold parameter: " << prop.name() << std::endl;
213  return;
214  }
215  int ic = i->second;
216 
218  if ( !sap ) {
219  std::cerr << "could not dcast " << prop.name()
220  << " to a Gaudi::Property<std::vector<std::string>> (which it should be!)" << std::endl;
221  } else {
222  for ( auto& i : sap->value() ) setOutputLevel( i, ic );
223  }
224 }
225 
226 //#############################################################################
227 
228 #ifdef NDEBUG
230 #else
232  if ( prop.name() == "countInactive" ) {
233  Gaudi::Property<bool>* p = dynamic_cast<Gaudi::Property<bool>*>( &prop );
234  if ( p ) MsgStream::enableCountInactive( p->value() );
235  }
236 }
237 #endif
238 
239 //#############################################################################
242 
243  m_suppress = false;
244 
245  {
247 
248  if ( m_stats ) {
249  os << "Summarizing all message counts" << std::endl;
250  } else {
251  os << "Listing sources of suppressed message: " << std::endl;
252  }
253 
254  os << "=====================================================" << std::endl;
255  os << " Message Source | Level | Count" << std::endl;
256  os << "-----------------------------+---------+-------------" << std::endl;
257 
258  bool found( false );
259 
260  for ( auto itr = m_sourceMap.begin(); itr != m_sourceMap.end(); ++itr ) {
261  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
262  if ( ( itr->second.msg[ic] >= m_msgLimit[ic] && m_msgLimit[ic] != 0 ) ||
263  ( m_stats && itr->second.msg[ic] > 0 && ic >= m_statLevel.value() ) ) {
264  os << " ";
265  os.width( 28 );
266  os.setf( std::ios_base::left, std::ios_base::adjustfield );
267  os << itr->first;
268  os << "|";
269 
270  os.width( 8 );
271  os.setf( std::ios_base::right, std::ios_base::adjustfield );
272  os << levelNames[ic];
273  os << " |";
274 
275  os.width( 9 );
276  os << itr->second.msg[ic];
277  os << std::endl;
278 
279  found = true;
280  }
281  }
282  }
283  os << "=====================================================" << std::endl;
284  if ( found || m_stats ) std::cout << os.str() << std::flush;
285  }
286 
287 #ifndef NDEBUG
288  if ( m_inactCount.value() ) {
289 
291  os << "Listing sources of Unprotected and Unseen messages\n";
292 
293  bool found( false );
294 
295  unsigned int ml( 0 );
296  for ( const auto& itr : m_inactiveMap ) {
297  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
298  if ( itr.second.msg[ic] != 0 && itr.first.length() > ml ) { ml = itr.first.length(); }
299  }
300  }
301 
302  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
303 
304  os << std::endl << " ";
305  os.width( ml + 2 );
306  os.setf( std::ios_base::left, std::ios_base::adjustfield );
307  os << "Message Source";
308  os.width( 1 );
309  os << "| Level | Count" << std::endl;
310 
311  for ( unsigned int i = 0; i < ml + 3; ++i ) os << "-";
312  os << "+---------+-----------" << std::endl;
313 
314  for ( auto itr = m_inactiveMap.begin(); itr != m_inactiveMap.end(); ++itr ) {
315  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
316  if ( itr->second.msg[ic] != 0 ) {
317  os << " ";
318  os.width( ml + 2 );
319  os.setf( std::ios_base::left, std::ios_base::adjustfield );
320  os << itr->first;
321 
322  os << "|";
323 
324  os.width( 8 );
325  os.setf( std::ios_base::right, std::ios_base::adjustfield );
326  os << levelNames[ic];
327 
328  os << " |";
329 
330  os.width( 9 );
331  os << itr->second.msg[ic];
332 
333  os << std::endl;
334 
335  found = true;
336  }
337  }
338  }
339  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
340  os << std::endl;
341 
342  if ( found ) std::cout << os.str() << std::flush;
343  }
344 #endif
345 
346  return StatusCode::SUCCESS;
347 }
348 
349 //#############################################################################
350 // ---------------------------------------------------------------------------
351 // Routine: reportMessage
352 // Purpose: dispatches a message to the relevant streams.
353 // ---------------------------------------------------------------------------
354 //
355 void MessageSvc::reportMessage( const Message& msg, int outputLevel ) {
356  auto lock = std::scoped_lock{m_reportMutex};
358 }
359 
360 void MessageSvc::i_reportMessage( const Message& msg, int outputLevel ) {
361  int key = msg.getType();
362 
363  ++m_msgCount[key];
364 
365  const Message* cmsg = &msg;
366 
367  // processing logged streams
368  if ( !m_loggedStreams.empty() ) {
369  auto iLog = m_loggedStreams.find( msg.getSource() );
370  if ( m_loggedStreams.end() != iLog ) { ( *iLog->second ) << *cmsg << std::endl; }
371  }
372 
373  if ( m_suppress.value() || m_stats.value() ) {
374 
375  // Increase the counter of 'key' type of messages for the source and
376  // get the new value.
377  const int nmsg = ++( m_sourceMap[msg.getSource()].msg[key] );
378 
379  if ( m_suppress.value() && m_msgLimit[key] != 0 ) {
380  if ( nmsg > m_msgLimit[key] ) return;
381  if ( nmsg == m_msgLimit[key] ) {
382  std::string txt = levelNames[key] + " message limit (" + std::to_string( m_msgLimit[key].value() ) +
383  ") reached for " + msg.getSource() + ". Suppressing further output.";
384  cmsg = new Message( msg.getSource(), MSG::WARNING, std::move( txt ) );
385  cmsg->setFormat( msg.getFormat() );
386  }
387  }
388  }
389 
390  auto range = m_streamMap.equal_range( key );
391  if ( range.first != m_streamMap.end() ) {
392  std::for_each( range.first, range.second,
393  [&]( StreamMap::const_reference sm ) { *sm.second.second << *cmsg << std::endl; } );
394  } else if ( key >= outputLevel ) {
395  msg.setFormat( m_defaultFormat );
396  msg.setTimeFormat( m_defaultTimeFormat );
397  if ( !m_color ) {
398  ( *m_defaultStream ) << *cmsg << std::endl << std::flush;
399  } else {
400  ( *m_defaultStream ) << m_logColorCodes[key] << *cmsg << "\033[m" << std::endl << std::flush;
401  }
402  }
403 
404  if ( cmsg != &msg ) { delete cmsg; }
405 }
406 
407 //#############################################################################
408 // ---------------------------------------------------------------------------
409 // Routine: reportMessage
410 // Purpose: dispatches a message to the relevant streams.
411 // ---------------------------------------------------------------------------
412 //
413 void MessageSvc::reportMessage( const Message& msg ) { reportMessage( msg, outputLevel( msg.getSource() ) ); }
414 
415 //#############################################################################
416 // ---------------------------------------------------------------------------
417 // Routine: reportMessage
418 // Purpose: dispatches a message to the relevant streams.
419 // ---------------------------------------------------------------------------
420 //
423 }
424 
425 //#############################################################################
426 // ---------------------------------------------------------------------------
427 // Routine: sendMessage
428 // Purpose: finds a message for a given status code and dispatches it.
429 // ---------------------------------------------------------------------------
430 //
431 void MessageSvc::reportMessage( const StatusCode& code, std::string_view source ) {
432  auto lock = std::scoped_lock{m_messageMapMutex};
433  i_reportMessage( code, source );
434 }
435 
436 void MessageSvc::i_reportMessage( const StatusCode& code, std::string_view source ) {
437  int level = outputLevel( source );
438  auto report = [&]( Message mesg ) {
439  mesg.setSource( source );
440  Message stat_code( std::string{source}, mesg.getType(), "Status Code " + std::to_string( code.getCode() ) );
441  i_reportMessage( std::move( stat_code ), level );
442  i_reportMessage( std::move( mesg ), level );
443  };
444 
445  auto range = m_messageMap.equal_range( code );
446  if ( range.first != m_messageMap.end() ) {
447  std::for_each( range.first, range.second, [&]( MessageMap::const_reference sm ) { report( sm.second ); } );
448  } else {
449  report( m_defaultMessage );
450  }
451 }
452 
453 //#############################################################################
454 // ---------------------------------------------------------------------------
455 // Routine: insertStream
456 // Purpose: inserts a stream for a message type.
457 // ---------------------------------------------------------------------------
458 //
459 
462 }
463 
464 //#############################################################################
465 // ---------------------------------------------------------------------------
466 // Routine: eraseStream
467 // Purpose: erases all the streams for all the message types.
468 // ---------------------------------------------------------------------------
469 //
470 
472 
473 //#############################################################################
474 // ---------------------------------------------------------------------------
475 // Routine: eraseStream
476 // Purpose: erases all the streams for a message type.
477 // ---------------------------------------------------------------------------
478 //
479 
480 void MessageSvc::eraseStream( int message_type ) { m_streamMap.erase( message_type ); }
481 
482 //#############################################################################
483 // ---------------------------------------------------------------------------
484 // Routine: eraseStream
485 // Purpose: erases one stream for a message type.
486 // ---------------------------------------------------------------------------
487 //
488 
490  if ( stream ) {
491  erase_if( m_streamMap, m_streamMap.equal_range( key ),
492  [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
493  }
494 }
495 
496 //#############################################################################
497 // ---------------------------------------------------------------------------
498 // Routine: eraseStream
499 // Purpose: erases one stream for all message types.
500 // ---------------------------------------------------------------------------
501 //
502 
504  if ( stream ) {
505  erase_if( m_streamMap, [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
506  }
507 }
508 
509 //#############################################################################
510 // ---------------------------------------------------------------------------
511 // Routine: insertMessage
512 // Purpose: inserts a message for a status code.
513 // ---------------------------------------------------------------------------
514 //
515 
517  auto lock = std::scoped_lock{m_messageMapMutex};
519 }
520 
521 //#############################################################################
522 // ---------------------------------------------------------------------------
523 // Routine: eraseMessage
524 // Purpose: erases all the messages for all the status codes.
525 // ---------------------------------------------------------------------------
526 //
527 
529  auto lock = std::scoped_lock{m_messageMapMutex};
531 }
532 
533 //#############################################################################
534 // ---------------------------------------------------------------------------
535 // Routine: eraseMessage
536 // Purpose: erases all the messages for a status code.
537 // ---------------------------------------------------------------------------
538 //
539 
541  auto lock = std::scoped_lock{m_messageMapMutex};
543 }
544 
545 //#############################################################################
546 // ---------------------------------------------------------------------------
547 // Routine: eraseMessage
548 // Purpose: erases one message for a status code.
549 // ---------------------------------------------------------------------------
550 //
551 
553  auto lock = std::scoped_lock{m_messageMapMutex};
554 
556  [&]( MessageMap::const_reference j ) { return j.second == msg; } );
557 }
558 
559 // ---------------------------------------------------------------------------
561  // ---------------------------------------------------------------------------
562  return m_outputLevel;
563 }
564 
565 // ---------------------------------------------------------------------------
566 int MessageSvc::outputLevel( std::string_view source ) const {
567  // ---------------------------------------------------------------------------
568  auto lock = std::scoped_lock{m_thresholdMapMutex};
569  auto it = m_thresholdMap.find( source );
570  return it != m_thresholdMap.end() ? it->second : m_outputLevel.value();
571 }
572 
573 // ---------------------------------------------------------------------------
574 void MessageSvc::setOutputLevel( int new_level ) {
575  // ---------------------------------------------------------------------------
576  m_outputLevel = new_level;
577 }
578 
579 // ---------------------------------------------------------------------------
580 void MessageSvc::setOutputLevel( std::string_view source, int level ) {
581  // ---------------------------------------------------------------------------
582  auto lock = std::scoped_lock{m_thresholdMapMutex};
583 
584  // only write if we really have to...
585  auto i = m_thresholdMap.find( source );
586  if ( i == m_thresholdMap.end() ) {
587  m_thresholdMap.emplace( source, level );
588  } else if ( i->second != level ) {
589  i->second = level;
590  }
591 }
592 
593 // ---------------------------------------------------------------------------
594 std::string MessageSvc::getLogColor( int logLevel ) const {
595  // ---------------------------------------------------------------------------
596  return ( logLevel < MSG::NUM_LEVELS ) ? m_logColorCodes[logLevel] : "";
597 }
598 
599 // ---------------------------------------------------------------------------
601 
602 // ---------------------------------------------------------------------------
603 void MessageSvc::incrInactiveCount( MSG::Level level, std::string_view source ) {
604  auto entry = m_inactiveMap.find( source );
605  if ( entry == m_inactiveMap.end() ) { entry = m_inactiveMap.emplace( source, MsgAry{} ).first; }
606  ++entry->second.msg[level];
607 
610  std::cout << "== inactive message detected from " << source << " ==\n";
611  std::string t;
612  System::backTrace( t, 25, 0 );
613  std::cout << t << std::endl;
614  }
615 }
616 
617 // ---------------------------------------------------------------------------
618 
620  // reset state
622 
623  // make the unique set of output filenames
624  std::set<std::string_view> outFileNames;
626  std::inserter( outFileNames, outFileNames.end() ),
627  []( const auto& p ) -> std::string_view { return p.second; } );
628  // map each unique filename to an ofstream
630  std::transform( outFileNames.begin(), outFileNames.end(), std::inserter( outStreams, outStreams.end() ),
631  []( std::string_view fname ) {
632  return std::pair{fname, std::make_shared<std::ofstream>(
633  std::string{fname}, std::ios_base::out | std::ios_base::trunc )};
634  } );
635  // associate the stream to ofstream...
636  for ( auto& iProp : m_loggedStreamsName ) {
637  auto& stream = outStreams.at( iProp.second );
638  if ( stream->good() ) m_loggedStreams.emplace( iProp.first, stream );
639  }
640 }
641 
642 // ---------------------------------------------------------------------------
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:25
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:35
std::ostringstream::width
T width(T... args)
GaudiHive.precedence.message
message
Definition: precedence.py:21
Gaudi::Details::PropertyBase::name
const std::string name() const
property name
Definition: PropertyBase.h:39
MessageSvc::reinitialize
StatusCode reinitialize() override
Reinitialize Service.
Definition: MessageSvc.cpp:127
MessageSvc::m_logColors
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_logColors
Definition: MessageSvc.h:153
std::for_each
T for_each(T... args)
Write.stream
stream
Definition: Write.py:31
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
MessageSvc::setupLimits
void setupLimits(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:179
compareOutputFiles.pname
string pname
Definition: compareOutputFiles.py:482
std::string
STL class.
MessageSvc::m_stats
Gaudi::Property< bool > m_stats
Definition: MessageSvc.h:139
MsgStream::enableCountInactive
static GAUDI_API bool enableCountInactive(bool value=true)
Enable/disable the count of inactive messages.
Definition: MsgStream.cpp:41
Read.app
app
Definition: Read.py:35
std::move
T move(T... args)
Service::m_state
Gaudi::StateMachine::State m_state
Service state
Definition: Service.h:206
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:355
MSG::INFO
@ INFO
Definition: IMessageSvc.h:25
System.h
std::pair
MessageSvc::MsgAry
Private helper class to keep the count of messages of a type (MSG::LEVEL).
Definition: MessageSvc.h:192
MessageSvc::m_defaultTimeFormat
Gaudi::Property< std::string > m_defaultTimeFormat
Definition: MessageSvc.h:138
MSG::BLACK
@ BLACK
Definition: IMessageSvc.h:26
MessageSvc::insertMessage
void insertMessage(const StatusCode &code, Message message) override
Definition: MessageSvc.cpp:516
std::find_if
T find_if(T... args)
ISvcLocator
Definition: ISvcLocator.h:46
GaudiException
Definition: GaudiException.h:31
MessageSvc::incrInactiveCount
void incrInactiveCount(MSG::Level level, std::string_view src) override
Definition: MessageSvc.cpp:603
MessageSvc::reportMessage
void reportMessage(const Message &message) override
Definition: MessageSvc.cpp:413
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:18
std::multimap::emplace
T emplace(T... args)
MessageSvc::m_logColorCodes
std::string m_logColorCodes[MSG::NUM_LEVELS]
Definition: MessageSvc.h:189
MessageSvc::m_reportMutex
std::recursive_mutex m_reportMutex
Mutex to synchronize multiple threads printing.
Definition: MessageSvc.h:213
MSG::WARNING
@ WARNING
Definition: IMessageSvc.h:25
MessageSvc.h
MSG::BLUE
@ BLUE
Definition: IMessageSvc.h:26
MessageSvc::i_reportMessage
virtual void i_reportMessage(const Message &msg, int outputLevel)
Internal implementation of reportMessage(const Message&,int) without lock.
Definition: MessageSvc.cpp:360
gaudirun.c
c
Definition: gaudirun.py:509
MessageSvc::messageCount
int messageCount(MSG::Level logLevel) const override
Definition: MessageSvc.cpp:600
System::backTrace
GAUDI_API int backTrace(void **addresses, const int depth)
StatusCode.h
IAppMgrUI.h
std::multimap::clear
T clear(T... args)
std::fill
T fill(T... args)
Gaudi::Property::setValue
bool setValue(const ValueType &v)
Definition: Property.h:242
MessageSvc::m_streamMap
StreamMap m_streamMap
Stream map.
Definition: MessageSvc.h:185
MessageSvc::m_thresholdMapMutex
std::recursive_mutex m_thresholdMapMutex
Mutex to synchronize multiple access to m_thresholdMap (.
Definition: MessageSvc.h:220
MSG::PURPLE
@ PURPLE
Definition: IMessageSvc.h:26
MessageSvc::m_msgLimit
std::array< Gaudi::Property< int >, MSG::NUM_LEVELS > m_msgLimit
Definition: MessageSvc.h:162
bug_34121.t
t
Definition: bug_34121.py:30
MessageSvc::m_statLevel
Gaudi::Property< unsigned int > m_statLevel
Definition: MessageSvc.h:140
TimingHistograms.name
name
Definition: TimingHistograms.py:23
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:332
StatusCode
Definition: StatusCode.h:65
Message
Definition: Message.h:27
std::cout
CLHEP::begin
double * begin(CLHEP::HepVector &v)
Definition: TupleAlg.cpp:45
MessageSvc::m_sourceMap
std::map< std::string, MsgAry, std::less<> > m_sourceMap
Definition: MessageSvc.h:199
CommonMessaging
Definition: CommonMessaging.h:66
Gaudi::StateMachine::OFFLINE
@ OFFLINE
Definition: StateMachine.h:23
Gaudi::Property::declareUpdateHandler
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Definition: Property.h:146
MessageSvc::m_msgCount
std::array< int, MSG::NUM_LEVELS > m_msgCount
Definition: MessageSvc.h:201
Gaudi::Property::value
const ValueType & value() const
Backward compatibility (.
Definition: Property.h:240
std::to_string
T to_string(T... args)
Message::setFormat
void setFormat(std::string msg) const
Set the format string.
Definition: Message.cpp:153
std::array
STL class.
MessageSvc::m_defaultMessage
Message m_defaultMessage
Default Message.
Definition: MessageSvc.h:184
MessageSvc::m_thresholdMap
ThresholdMap m_thresholdMap
Output level threshold map.
Definition: MessageSvc.h:187
std::ostringstream::setf
T setf(T... args)
std::flush
T flush(T... args)
std::multimap::erase
T erase(T... args)
SmartIF< IAppMgrUI >
std::map
STL class.
MessageSvc::m_messageMap
MessageMap m_messageMap
Message map.
Definition: MessageSvc.h:186
MessageSvc::setupThreshold
void setupThreshold(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:199
gaudirun.level
level
Definition: gaudirun.py:346
std::transform
T transform(T... args)
MessageSvc::m_tracedInactiveSources
Gaudi::Property< std::vector< std::string > > m_tracedInactiveSources
Definition: MessageSvc.h:174
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:25
MessageSvc::m_inactiveMap
std::map< std::string, MsgAry, std::less<> > m_inactiveMap
Definition: MessageSvc.h:199
MessageSvc
Definition: MessageSvc.h:40
MessageSvc::outputLevel
int outputLevel() const override
Definition: MessageSvc.cpp:560
std::ostringstream
STL class.
MessageSvc::finalize
StatusCode finalize() override
Finalize Service.
Definition: MessageSvc.cpp:241
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:142
MSG::RED
@ RED
Definition: IMessageSvc.h:26
MessageSvc::m_inactCount
Gaudi::Property< bool > m_inactCount
Definition: MessageSvc.h:172
MSG::Level
Level
Definition: IMessageSvc.h:25
std::multimap::equal_range
T equal_range(T... args)
gaudirun.type
type
Definition: gaudirun.py:154
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
std::endl
T endl(T... args)
MessageSvc::m_messageMapMutex
std::recursive_mutex m_messageMapMutex
Mutex to synchronize multiple access to m_messageMap.
Definition: MessageSvc.h:216
MSG::WHITE
@ WHITE
Definition: IMessageSvc.h:26
MessageSvc::NamedStream
std::pair< std::string, std::ostream * > NamedStream
Definition: MessageSvc.h:42
MessageSvc::m_loggedStreamsName
Gaudi::Property< std::map< std::string, std::string, std::less<> > > m_loggedStreamsName
Definition: MessageSvc.h:180
MSG::ALWAYS
@ ALWAYS
Definition: IMessageSvc.h:25
MessageSvc::setupInactCount
void setupInactCount(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:231
std::begin
T begin(T... args)
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
MessageSvc::eraseMessage
void eraseMessage() override
Definition: MessageSvc.cpp:528
MSG::NIL
@ NIL
Definition: IMessageSvc.h:25
Kernel.h
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:25
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:25
MSG::CYAN
@ CYAN
Definition: IMessageSvc.h:26
MSG::GREEN
@ GREEN
Definition: IMessageSvc.h:26
std::string::empty
T empty(T... args)
MessageSvc::m_color
Gaudi::Property< bool > m_color
Definition: MessageSvc.h:151
StatusCode::getCode
code_t getCode() const
Retrieve value ("checks" the StatusCode)
Definition: StatusCode.h:149
MessageSvc::m_loggedStreams
std::map< std::string, std::shared_ptr< std::ostream >, std::less<> > m_loggedStreams
Definition: MessageSvc.h:203
std::ostringstream::str
T str(T... args)
MessageSvc::initialize
StatusCode initialize() override
Initialize Service.
Definition: MessageSvc.cpp:110
std::end
T end(T... args)
IOTest.end
end
Definition: IOTest.py:123
MessageSvc::getLogColor
std::string getLogColor(int logLevel) const override
Definition: MessageSvc.cpp:594
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
MessageSvc::eraseStream
void eraseStream() override
Definition: MessageSvc.cpp:471
MessageSvc::m_thresholdProp
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_thresholdProp
Definition: MessageSvc.h:142
MessageSvc::setupLogStreams
void setupLogStreams()
Definition: MessageSvc.cpp:619
MessageSvc::MessageSvc
MessageSvc(const std::string &name, ISvcLocator *svcloc)
Definition: MessageSvc.cpp:82
MessageSvc::m_suppress
Gaudi::Property< bool > m_suppress
Definition: MessageSvc.h:171
MSG::NUM_LEVELS
@ NUM_LEVELS
Definition: IMessageSvc.h:25
std::inserter
T inserter(T... args)
MessageSvc::insertStream
void insertStream(int message_type, std::string name, std::ostream *stream) override
Definition: MessageSvc.cpp:460
MessageSvc::m_defaultFormat
Gaudi::Property< std::string > m_defaultFormat
Definition: MessageSvc.h:137
MessageSvc::setOutputLevel
void setOutputLevel(int new_level) override
Definition: MessageSvc.cpp:574
ProduceConsume.key
key
Definition: ProduceConsume.py:52
Service::m_outputLevel
Gaudi::Property< int > m_outputLevel
flag indicating whether ToolHandle tools have been added to m_tools
Definition: Service.h:235
std::set
STL class.
Gaudi::Property< int >
MSG::YELLOW
@ YELLOW
Definition: IMessageSvc.h:26
Gaudi::Functional::details::zip::range
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
Definition: FunctionalDetails.h:97
Message.h
Iterator
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:28
MessageSvc::setupColors
void setupColors(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:137