The Gaudi Framework  master (37c0b60a)
MessageSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 Iterator, typename Predicate>
47  void erase_if( Container& c, std::pair<Iterator, Iterator> range, Predicate pred ) {
48  return erase_if( c, std::move( range.first ), std::move( range.second ), std::forward<Predicate>( pred ) );
49  }
50 
51  std::string colTrans( std::string_view col, int offset ) {
52  int icol = ( col == "black" ? MSG::BLACK
53  : col == "red" ? MSG::RED
54  : col == "green" ? MSG::GREEN
55  : col == "yellow" ? MSG::YELLOW
56  : col == "blue" ? MSG::BLUE
57  : col == "purple" ? MSG::PURPLE
58  : col == "cyan" ? MSG::CYAN
59  : col == "white" ? MSG::WHITE
60  : 8 );
61  return std::to_string( icol + offset );
62  }
63 } // namespace
64 
65 // Instantiation of a static factory class used by clients to create
66 // instances of this service
68 
69 static const std::string levelNames[MSG::NUM_LEVELS] = { "NIL", "VERBOSE", "DEBUG", "INFO",
70  "WARNING", "ERROR", "FATAL", "ALWAYS" };
71 
72 // Constructor
74 
76  SmartIF<IAppMgrUI> app = svcloc;
77  if ( app ) app->outputLevelUpdate();
78  } );
79 
80 #ifndef NDEBUG
81  // initialize the MsgStream static flag.
83 #endif
84 
85  for ( int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
86  m_logColors[ic].declareUpdateHandler( &MessageSvc::setupColors, this );
87  m_msgLimit[ic].declareUpdateHandler( &MessageSvc::setupLimits, this );
88  m_thresholdProp[ic].declareUpdateHandler( &MessageSvc::setupThreshold, this );
89  }
90 
91  m_logColors[MSG::FATAL].set( { "blue", "red" } );
92  m_logColors[MSG::ERROR].set( { "white", "red" } );
93  m_logColors[MSG::WARNING].set( { "yellow" } );
94 
96 }
97 
98 // #############################################################################
99 
103  if ( sc.isFailure() ) return sc;
104 
105 #ifdef _WIN32
106  m_color = false;
107 #endif
108 
109  // make sure the map of logged stream names is initialized
110  setupLogStreams();
111 
112  return StatusCode::SUCCESS;
113 }
114 
115 // #############################################################################
116 
120  StatusCode sc = initialize();
122 
123  return sc;
124 }
125 
126 // #############################################################################
127 
129  const auto& pname = prop.name();
130  int level =
131  ( pname == "fatalColorCode" ? MSG::FATAL
132  : pname == "errorColorCode" ? MSG::ERROR
133  : pname == "warningColorCode" ? MSG::WARNING
134  : pname == "infoColorCode" ? MSG::INFO
135  : pname == "debugColorCode" ? MSG::DEBUG
136  : pname == "verboseColorCode" ? MSG::VERBOSE
137  : pname == "alwaysColorCode"
138  ? MSG::ALWAYS
139  : ( throw GaudiException( "ERROR: Unknown message color parameter: " + pname, name(), StatusCode::FAILURE ),
140  -1 ) );
141 
142  auto& code = m_logColorCodes[level];
143 
144  const auto& col_desc = m_logColors[level].value();
145 
146  if ( col_desc.size() == 1 ) {
147  const std::string& desc = col_desc[0];
148  if ( desc.empty() ) {
149  code = "";
150  } else if ( desc[0] == '[' ) {
151  code = "\033" + desc;
152  } else {
153  code = "\033[" + colTrans( desc, 90 ) + ";1m";
154  }
155  } else if ( col_desc.size() == 2 ) {
156  code = "\033[" + colTrans( col_desc[0], 90 ) + ";" + colTrans( col_desc[1], 100 ) + ";1m";
157  } else { // empty desc: no color
158  code = "";
159  }
160 }
161 // #############################################################################
162 
164  // Just report problems in the settings of the limits and unknown limit parameters
165  if ( prop.name() == "alwaysLimit" ) {
166  Gaudi::Property<int>* p = dynamic_cast<Gaudi::Property<int>*>( &prop );
167  if ( p && p->value() != 0 ) {
168  std::cout << "MessageSvc ERROR: cannot suppress ALWAYS messages" << std::endl;
169  p->setValue( 0 );
170  }
171  } else if ( prop.name() == "defaultLimit" ) {
172  for ( int i = MSG::VERBOSE; i < MSG::NUM_LEVELS; ++i ) {
173  if ( i != MSG::ALWAYS ) { m_msgLimit[i] = m_msgLimit[MSG::NIL].value(); }
174  }
175  } else if ( prop.name() != "fatalLimit" && prop.name() != "errorLimit" && prop.name() != "warningLimit" &&
176  prop.name() == "infoLimit" && prop.name() == "debugLimit" && prop.name() == "verboseLimit" ) {
177  std::cout << "MessageSvc ERROR: Unknown message limit parameter: " << prop.name() << std::endl;
178  return;
179  }
180 }
181 // #############################################################################
182 
184 
185  static const std::array<std::pair<const char*, MSG::Level>, 7> tbl{ { { "setFatal", MSG::FATAL },
186  { "setError", MSG::ERROR },
187  { "setWarning", MSG::WARNING },
188  { "setInfo", MSG::INFO },
189  { "setDebug", MSG::DEBUG },
190  { "setVerbose", MSG::VERBOSE },
191  { "setAlways", MSG::ALWAYS } } };
192 
193  auto i = std::find_if( std::begin( tbl ), std::end( tbl ),
194  [&]( const std::pair<const char*, MSG::Level>& t ) { return prop.name() == t.first; } );
195  if ( i == std::end( tbl ) ) {
196  std::cerr << "MessageSvc ERROR: Unknown message threshold parameter: " << prop.name() << std::endl;
197  return;
198  }
199  int ic = i->second;
200 
202  if ( !sap ) {
203  std::cerr << "could not dcast " << prop.name()
204  << " to a Gaudi::Property<std::vector<std::string>> (which it should be!)" << std::endl;
205  } else {
206  for ( auto& i : sap->value() ) setOutputLevel( i, ic );
207  }
208 }
209 
210 // #############################################################################
211 
212 #ifdef NDEBUG
214 #else
216  if ( prop.name() == "countInactive" ) {
217  Gaudi::Property<bool>* p = dynamic_cast<Gaudi::Property<bool>*>( &prop );
218  if ( p ) MsgStream::enableCountInactive( p->value() );
219  }
220 }
221 #endif
222 
223 // #############################################################################
226 
227  m_suppress = false;
228 
229  {
231 
232  if ( m_stats ) {
233  os << "Summarizing all message counts" << std::endl;
234  } else {
235  os << "Listing sources of suppressed message: " << std::endl;
236  }
237 
238  os << "=====================================================" << std::endl;
239  os << " Message Source | Level | Count" << std::endl;
240  os << "-----------------------------+---------+-------------" << std::endl;
241 
242  bool found( false );
243 
244  for ( auto itr = m_sourceMap.begin(); itr != m_sourceMap.end(); ++itr ) {
245  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
246  if ( ( itr->second.msg[ic] >= m_msgLimit[ic] && m_msgLimit[ic] != 0 ) ||
247  ( m_stats && itr->second.msg[ic] > 0 && ic >= m_statLevel.value() ) ) {
248  os << " ";
249  os.width( 28 );
250  os.setf( std::ios_base::left, std::ios_base::adjustfield );
251  os << itr->first;
252  os << "|";
253 
254  os.width( 8 );
255  os.setf( std::ios_base::right, std::ios_base::adjustfield );
256  os << levelNames[ic];
257  os << " |";
258 
259  os.width( 9 );
260  os << itr->second.msg[ic];
261  os << std::endl;
262 
263  found = true;
264  }
265  }
266  }
267  os << "=====================================================" << std::endl;
268  if ( found || m_stats ) std::cout << os.str() << std::flush;
269  }
270 
271 #ifndef NDEBUG
272  if ( m_inactCount.value() ) {
273 
275  os << "Listing sources of Unprotected and Unseen messages\n";
276 
277  bool found( false );
278 
279  unsigned int ml( 0 );
280  for ( const auto& itr : m_inactiveMap ) {
281  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
282  if ( itr.second.msg[ic] != 0 && itr.first.length() > ml ) { ml = itr.first.length(); }
283  }
284  }
285 
286  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
287 
288  os << std::endl << " ";
289  os.width( ml + 2 );
290  os.setf( std::ios_base::left, std::ios_base::adjustfield );
291  os << "Message Source";
292  os.width( 1 );
293  os << "| Level | Count" << std::endl;
294 
295  for ( unsigned int i = 0; i < ml + 3; ++i ) os << "-";
296  os << "+---------+-----------" << std::endl;
297 
298  for ( auto itr = m_inactiveMap.begin(); itr != m_inactiveMap.end(); ++itr ) {
299  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
300  if ( itr->second.msg[ic] != 0 ) {
301  os << " ";
302  os.width( ml + 2 );
303  os.setf( std::ios_base::left, std::ios_base::adjustfield );
304  os << itr->first;
305 
306  os << "|";
307 
308  os.width( 8 );
309  os.setf( std::ios_base::right, std::ios_base::adjustfield );
310  os << levelNames[ic];
311 
312  os << " |";
313 
314  os.width( 9 );
315  os << itr->second.msg[ic];
316 
317  os << std::endl;
318 
319  found = true;
320  }
321  }
322  }
323  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
324  os << std::endl;
325 
326  if ( found ) std::cout << os.str() << std::flush;
327  }
328 #endif
329 
330  return StatusCode::SUCCESS;
331 }
332 
333 // #############################################################################
334 // ---------------------------------------------------------------------------
335 // Routine: reportMessage
336 // Purpose: dispatches a message to the relevant streams.
337 // ---------------------------------------------------------------------------
338 //
339 void MessageSvc::reportMessage( const Message& msg, int outputLevel ) {
340  auto lock = std::scoped_lock{ m_reportMutex };
342 }
343 
344 void MessageSvc::i_reportMessage( const Message& msg, int outputLevel ) {
345  int key = msg.getType();
346 
347  ++m_msgCount[key];
348 
349  const Message* cmsg = &msg;
350 
351  // processing logged streams
352  if ( !m_loggedStreams.empty() ) {
353  auto iLog = m_loggedStreams.find( msg.getSource() );
354  if ( m_loggedStreams.end() != iLog ) { ( *iLog->second ) << *cmsg << std::endl; }
355  }
356 
357  if ( m_suppress.value() || m_stats.value() ) {
358 
359  // Increase the counter of 'key' type of messages for the source and
360  // get the new value.
361  const int nmsg = ++( m_sourceMap[msg.getSource()].msg[key] );
362 
363  if ( m_suppress.value() && m_msgLimit[key] != 0 ) {
364  if ( nmsg > m_msgLimit[key] ) return;
365  if ( nmsg == m_msgLimit[key] ) {
366  std::string txt = levelNames[key] + " message limit (" + std::to_string( m_msgLimit[key].value() ) +
367  ") reached for " + msg.getSource() + ". Suppressing further output.";
368  cmsg = new Message( msg.getSource(), MSG::WARNING, std::move( txt ) );
369  cmsg->setFormat( msg.getFormat() );
370  }
371  }
372  }
373 
374  auto range = m_streamMap.equal_range( key );
375  if ( range.first != m_streamMap.end() ) {
376  std::for_each( range.first, range.second,
377  [&]( StreamMap::const_reference sm ) { *sm.second.second << *cmsg << std::endl; } );
378  } else if ( key >= outputLevel ) {
379  msg.setFormat( m_defaultFormat );
380  msg.setTimeFormat( m_defaultTimeFormat );
381  if ( !m_color ) {
382  ( *m_defaultStream ) << *cmsg << std::endl << std::flush;
383  } else {
384  ( *m_defaultStream ) << m_logColorCodes[key] << *cmsg << "\033[m" << std::endl << std::flush;
385  }
386  }
387 
388  if ( cmsg != &msg ) { delete cmsg; } // cppcheck-suppress autovarInvalidDeallocation; false positive
389 }
390 
391 // #############################################################################
392 // ---------------------------------------------------------------------------
393 // Routine: reportMessage
394 // Purpose: dispatches a message to the relevant streams.
395 // ---------------------------------------------------------------------------
396 //
397 void MessageSvc::reportMessage( const Message& msg ) { reportMessage( msg, outputLevel( msg.getSource() ) ); }
398 
399 // #############################################################################
400 // ---------------------------------------------------------------------------
401 // Routine: reportMessage
402 // Purpose: dispatches a message to the relevant streams.
403 // ---------------------------------------------------------------------------
404 //
406  reportMessage( Message{ std::move( source ), type, std::move( message ) } );
407 }
408 
409 // #############################################################################
410 // ---------------------------------------------------------------------------
411 // Routine: sendMessage
412 // Purpose: finds a message for a given status code and dispatches it.
413 // ---------------------------------------------------------------------------
414 //
415 void MessageSvc::reportMessage( const StatusCode& code, std::string_view source ) {
416  auto lock = std::scoped_lock{ m_messageMapMutex };
417  i_reportMessage( code, source );
418 }
419 
420 void MessageSvc::i_reportMessage( const StatusCode& code, std::string_view source ) {
421  int level = outputLevel( source );
422  auto report = [&]( Message mesg ) {
423  mesg.setSource( source );
424  Message stat_code( std::string{ source }, mesg.getType(), "Status Code " + std::to_string( code.getCode() ) );
425  i_reportMessage( std::move( stat_code ), level );
426  i_reportMessage( std::move( mesg ), level );
427  };
428 
429  auto range = m_messageMap.equal_range( code );
430  if ( range.first != m_messageMap.end() ) {
431  std::for_each( range.first, range.second, [&]( MessageMap::const_reference sm ) { report( sm.second ); } );
432  } else {
433  report( m_defaultMessage );
434  }
435 }
436 
437 // #############################################################################
438 // ---------------------------------------------------------------------------
439 // Routine: insertStream
440 // Purpose: inserts a stream for a message type.
441 // ---------------------------------------------------------------------------
442 //
443 
446 }
447 
448 // #############################################################################
449 // ---------------------------------------------------------------------------
450 // Routine: eraseStream
451 // Purpose: erases all the streams for all the message types.
452 // ---------------------------------------------------------------------------
453 //
454 
456 
457 // #############################################################################
458 // ---------------------------------------------------------------------------
459 // Routine: eraseStream
460 // Purpose: erases all the streams for a message type.
461 // ---------------------------------------------------------------------------
462 //
463 
464 void MessageSvc::eraseStream( int message_type ) { m_streamMap.erase( message_type ); }
465 
466 // #############################################################################
467 // ---------------------------------------------------------------------------
468 // Routine: eraseStream
469 // Purpose: erases one stream for a message type.
470 // ---------------------------------------------------------------------------
471 //
472 
474  if ( stream ) {
475  erase_if( m_streamMap, m_streamMap.equal_range( key ),
476  [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
477  }
478 }
479 
480 // #############################################################################
481 // ---------------------------------------------------------------------------
482 // Routine: eraseStream
483 // Purpose: erases one stream for all message types.
484 // ---------------------------------------------------------------------------
485 //
486 
488  if ( stream ) {
489  erase_if( m_streamMap, [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
490  }
491 }
492 
493 // #############################################################################
494 // ---------------------------------------------------------------------------
495 // Routine: insertMessage
496 // Purpose: inserts a message for a status code.
497 // ---------------------------------------------------------------------------
498 //
499 
501  auto lock = std::scoped_lock{ m_messageMapMutex };
503 }
504 
505 // #############################################################################
506 // ---------------------------------------------------------------------------
507 // Routine: eraseMessage
508 // Purpose: erases all the messages for all the status codes.
509 // ---------------------------------------------------------------------------
510 //
511 
513  auto lock = std::scoped_lock{ m_messageMapMutex };
515 }
516 
517 // #############################################################################
518 // ---------------------------------------------------------------------------
519 // Routine: eraseMessage
520 // Purpose: erases all the messages for a status code.
521 // ---------------------------------------------------------------------------
522 //
523 
525  auto lock = std::scoped_lock{ m_messageMapMutex };
527 }
528 
529 // #############################################################################
530 // ---------------------------------------------------------------------------
531 // Routine: eraseMessage
532 // Purpose: erases one message for a status code.
533 // ---------------------------------------------------------------------------
534 //
535 
537  auto lock = std::scoped_lock{ m_messageMapMutex };
538 
540  [&]( MessageMap::const_reference j ) { return j.second == msg; } );
541 }
542 
543 // ---------------------------------------------------------------------------
545  // ---------------------------------------------------------------------------
546  return m_outputLevel;
547 }
548 
549 // ---------------------------------------------------------------------------
550 int MessageSvc::outputLevel( std::string_view source ) const {
551  // ---------------------------------------------------------------------------
552  auto lock = std::scoped_lock{ m_thresholdMapMutex };
553  auto it = m_thresholdMap.find( source );
554  return it != m_thresholdMap.end() ? it->second : m_outputLevel.value();
555 }
556 
557 // ---------------------------------------------------------------------------
558 void MessageSvc::setOutputLevel( int new_level ) {
559  // ---------------------------------------------------------------------------
560  m_outputLevel = new_level;
561 }
562 
563 // ---------------------------------------------------------------------------
564 void MessageSvc::setOutputLevel( std::string_view source, int level ) {
565  // ---------------------------------------------------------------------------
566  auto lock = std::scoped_lock{ m_thresholdMapMutex };
567 
568  // only write if we really have to...
569  auto i = m_thresholdMap.find( source );
570  if ( i == m_thresholdMap.end() ) {
571  m_thresholdMap.emplace( source, level );
572  } else if ( i->second != level ) {
573  i->second = level;
574  }
575 }
576 
577 // ---------------------------------------------------------------------------
578 std::string MessageSvc::getLogColor( int logLevel ) const {
579  // ---------------------------------------------------------------------------
580  return ( logLevel < MSG::NUM_LEVELS ) ? m_logColorCodes[logLevel] : "";
581 }
582 
583 // ---------------------------------------------------------------------------
585 
586 // ---------------------------------------------------------------------------
587 void MessageSvc::incrInactiveCount( MSG::Level level, std::string_view source ) {
588  auto entry = m_inactiveMap.find( source );
589  if ( entry == m_inactiveMap.end() ) { entry = m_inactiveMap.emplace( source, MsgAry{} ).first; }
590  ++entry->second.msg[level];
591 
594  std::cout << "== inactive message detected from " << source << " ==\n";
595  std::string t;
596  System::backTrace( t, 25, 0 );
597  std::cout << t << std::endl;
598  }
599 }
600 
601 // ---------------------------------------------------------------------------
602 
604  // reset state
606 
607  // make the unique set of output filenames
608  std::set<std::string_view> outFileNames;
610  std::inserter( outFileNames, outFileNames.end() ),
611  []( const auto& p ) -> std::string_view { return p.second; } );
612  // map each unique filename to an ofstream
614  std::transform( outFileNames.begin(), outFileNames.end(), std::inserter( outStreams, outStreams.end() ),
615  []( std::string_view fname ) {
616  return std::pair{ fname, std::make_shared<std::ofstream>(
617  std::string{ fname }, std::ios_base::out | std::ios_base::trunc ) };
618  } );
619  // associate the stream to ofstream...
620  for ( auto& iProp : m_loggedStreamsName ) {
621  auto& stream = outStreams.at( iProp.second );
622  if ( stream->good() ) m_loggedStreams.emplace( iProp.first, stream );
623  }
624 }
625 
626 // ---------------------------------------------------------------------------
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)
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:118
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:32
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
MessageSvc::setupLimits
void setupLimits(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:163
precedence.message
message
Definition: precedence.py:19
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:36
std::move
T move(T... args)
Service::m_state
Gaudi::StateMachine::State m_state
Service state
Definition: Service.h:203
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
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:500
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:587
MessageSvc::reportMessage
void reportMessage(const Message &message) override
Definition: MessageSvc.cpp:397
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
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:344
gaudirun.c
c
Definition: gaudirun.py:525
MessageSvc::messageCount
int messageCount(MSG::Level logLevel) const override
Definition: MessageSvc.cpp:584
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:239
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:31
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:136
MessageSvc::m_statLevel
Gaudi::Property< unsigned int > m_statLevel
Definition: MessageSvc.h:140
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:26
ProduceConsume.j
j
Definition: ProduceConsume.py:104
std::cout
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:144
MessageSvc::m_msgCount
std::array< int, MSG::NUM_LEVELS > m_msgCount
Definition: MessageSvc.h:201
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
std::to_string
T to_string(T... args)
Message::setFormat
void setFormat(std::string msg) const
Set the format string.
Definition: Message.cpp:97
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:183
gaudirun.level
level
Definition: gaudirun.py:364
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:544
std::ostringstream
STL class.
MessageSvc::finalize
StatusCode finalize() override
Finalize Service.
Definition: MessageSvc.cpp:225
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
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:160
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:25
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
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:215
std::begin
T begin(T... args)
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
MessageSvc::eraseMessage
void eraseMessage() override
Definition: MessageSvc.cpp:512
MSG::NIL
@ NIL
Definition: IMessageSvc.h:25
Kernel.h
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:25
ProduceConsume.Message
Message
Definition: ProduceConsume.py:110
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.
Definition: StatusCode.h:136
compareOutputFiles.pname
pname
Definition: compareOutputFiles.py:482
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:101
std::end
T end(T... args)
IOTest.end
end
Definition: IOTest.py:125
MessageSvc::getLogColor
std::string getLogColor(int logLevel) const override
Definition: MessageSvc.cpp:578
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
MessageSvc::eraseStream
void eraseStream() override
Definition: MessageSvc.cpp:455
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:603
MessageSvc::MessageSvc
MessageSvc(const std::string &name, ISvcLocator *svcloc)
Definition: MessageSvc.cpp:73
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:444
MessageSvc::m_defaultFormat
Gaudi::Property< std::string > m_defaultFormat
Definition: MessageSvc.h:137
MessageSvc::setOutputLevel
void setOutputLevel(int new_level) override
Definition: MessageSvc.cpp:558
ProduceConsume.key
key
Definition: ProduceConsume.py:84
Service::m_outputLevel
Gaudi::Property< int > m_outputLevel
flag indicating whether ToolHandle tools have been added to m_tools
Definition: Service.h:232
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: details.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:128