The Gaudi Framework  v40r0 (475e45c1)
MessageSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 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 #include <fstream>
24 #include <iostream>
25 #include <sstream>
26 
27 namespace {
28 
29  // erase_if functions for containers which do NOT invalidate iterators
30  // after the erase point, eg.std::{unordered_}{,multi}map, std::{forward_,}list.
31  // To be explicit: this does NOT work with std::vector.
32 
33  // TODO: replace with std::experimental::erase_if (Libraries Fundamental TS v2)
34 
35  template <typename Container, typename Iterator, typename Predicate>
36  void erase_if( Container& c, Iterator first, Iterator last, Predicate pred ) {
37  while ( first != last ) {
38  if ( pred( *first ) )
39  first = c.erase( first );
40  else
41  ++first;
42  }
43  }
44 
45  template <typename Container, typename Iterator, typename Predicate>
46  void erase_if( Container& c, std::pair<Iterator, Iterator> range, Predicate pred ) {
47  return erase_if( c, std::move( range.first ), std::move( range.second ), std::forward<Predicate>( pred ) );
48  }
49 
50  std::string colTrans( std::string_view col, int offset ) {
51  int icol = ( col == "black" ? MSG::BLACK
52  : col == "red" ? MSG::RED
53  : col == "green" ? MSG::GREEN
54  : col == "yellow" ? MSG::YELLOW
55  : col == "blue" ? MSG::BLUE
56  : col == "purple" ? MSG::PURPLE
57  : col == "cyan" ? MSG::CYAN
58  : col == "white" ? MSG::WHITE
59  : 8 );
60  return std::to_string( icol + offset );
61  }
62 } // namespace
63 
65 
66 static const std::string levelNames[MSG::NUM_LEVELS] = { "NIL", "VERBOSE", "DEBUG", "INFO",
67  "WARNING", "ERROR", "FATAL", "ALWAYS" };
68 
69 MessageSvc::MessageSvc( const std::string& name, ISvcLocator* svcloc ) : base_class( name, svcloc ) {
70 
72  SmartIF<IAppMgrUI> app = svcloc;
73  if ( app ) app->outputLevelUpdate();
74  } );
75 
76 #ifndef NDEBUG
77  // initialize the MsgStream static flag.
79 #endif
80 
81  for ( int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
82  m_logColors[ic].declareUpdateHandler( &MessageSvc::setupColors, this );
83  m_msgLimit[ic].declareUpdateHandler( &MessageSvc::setupLimits, this );
84  m_thresholdProp[ic].declareUpdateHandler( &MessageSvc::setupThreshold, this );
85  }
86 
87  m_logColors[MSG::FATAL].set( { "blue", "red" } );
88  m_logColors[MSG::ERROR].set( { "white", "red" } );
89  m_logColors[MSG::WARNING].set( { "yellow" } );
90 
91  std::fill( std::begin( m_msgCount ), std::end( m_msgCount ), 0 );
92 }
93 
96  if ( sc.isFailure() ) return sc;
97 
98 #ifdef _WIN32
99  m_color = false;
100 #endif
101 
102  // make sure the map of logged stream names is initialized
103  setupLogStreams();
104 
105  return StatusCode::SUCCESS;
106 }
107 
110  StatusCode sc = initialize();
112 
113  return sc;
114 }
115 
117  const auto& pname = prop.name();
118  int level =
119  ( pname == "fatalColorCode" ? MSG::FATAL
120  : pname == "errorColorCode" ? MSG::ERROR
121  : pname == "warningColorCode" ? MSG::WARNING
122  : pname == "infoColorCode" ? MSG::INFO
123  : pname == "debugColorCode" ? MSG::DEBUG
124  : pname == "verboseColorCode" ? MSG::VERBOSE
125  : pname == "alwaysColorCode"
126  ? MSG::ALWAYS
127  : ( throw GaudiException( "ERROR: Unknown message color parameter: " + pname, name(), StatusCode::FAILURE ),
128  -1 ) );
129 
130  auto& code = m_logColorCodes[level];
131 
132  const auto& col_desc = m_logColors[level].value();
133 
134  if ( col_desc.size() == 1 ) {
135  const std::string& desc = col_desc[0];
136  if ( desc.empty() ) {
137  code = "";
138  } else if ( desc[0] == '[' ) {
139  code = "\033" + desc;
140  } else {
141  code = "\033[" + colTrans( desc, 90 ) + ";1m";
142  }
143  } else if ( col_desc.size() == 2 ) {
144  code = "\033[" + colTrans( col_desc[0], 90 ) + ";" + colTrans( col_desc[1], 100 ) + ";1m";
145  } else { // empty desc: no color
146  code = "";
147  }
148 }
149 
151  // Just report problems in the settings of the limits and unknown limit parameters
152  if ( prop.name() == "alwaysLimit" ) {
153  Gaudi::Property<int>* p = dynamic_cast<Gaudi::Property<int>*>( &prop );
154  if ( p && p->value() != 0 ) {
155  std::cout << "MessageSvc ERROR: cannot suppress ALWAYS messages" << std::endl;
156  p->setValue( 0 );
157  }
158  } else if ( prop.name() == "defaultLimit" ) {
159  for ( int i = MSG::VERBOSE; i < MSG::NUM_LEVELS; ++i ) {
160  if ( i != MSG::ALWAYS ) { m_msgLimit[i] = m_msgLimit[MSG::NIL].value(); }
161  }
162  } else if ( prop.name() != "fatalLimit" && prop.name() != "errorLimit" && prop.name() != "warningLimit" &&
163  prop.name() == "infoLimit" && prop.name() == "debugLimit" && prop.name() == "verboseLimit" ) {
164  std::cout << "MessageSvc ERROR: Unknown message limit parameter: " << prop.name() << std::endl;
165  return;
166  }
167 }
168 
170 
171  static const std::array<std::pair<const char*, MSG::Level>, 7> tbl{ { { "setFatal", MSG::FATAL },
172  { "setError", MSG::ERROR },
173  { "setWarning", MSG::WARNING },
174  { "setInfo", MSG::INFO },
175  { "setDebug", MSG::DEBUG },
176  { "setVerbose", MSG::VERBOSE },
177  { "setAlways", MSG::ALWAYS } } };
178 
179  auto i = std::find_if( std::begin( tbl ), std::end( tbl ),
180  [&]( const std::pair<const char*, MSG::Level>& t ) { return prop.name() == t.first; } );
181  if ( i == std::end( tbl ) ) {
182  std::cerr << "MessageSvc ERROR: Unknown message threshold parameter: " << prop.name() << std::endl;
183  return;
184  }
185  int ic = i->second;
186 
188  if ( !sap ) {
189  std::cerr << "could not dcast " << prop.name()
190  << " to a Gaudi::Property<std::vector<std::string>> (which it should be!)" << std::endl;
191  } else {
192  for ( auto& i : sap->value() ) setOutputLevel( i, ic );
193  }
194 }
195 
196 #ifdef NDEBUG
198 #else
200  if ( prop.name() == "countInactive" ) {
201  Gaudi::Property<bool>* p = dynamic_cast<Gaudi::Property<bool>*>( &prop );
202  if ( p ) MsgStream::enableCountInactive( p->value() );
203  }
204 }
205 #endif
206 
208  m_suppress = false;
209 
210  {
211  std::ostringstream os;
212 
213  if ( m_stats ) {
214  os << "Summarizing all message counts" << std::endl;
215  } else {
216  os << "Listing sources of suppressed message: " << std::endl;
217  }
218 
219  os << "=====================================================" << std::endl;
220  os << " Message Source | Level | Count" << std::endl;
221  os << "-----------------------------+---------+-------------" << std::endl;
222 
223  bool found( false );
224 
225  for ( auto itr = m_sourceMap.begin(); itr != m_sourceMap.end(); ++itr ) {
226  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
227  if ( ( itr->second.msg[ic] >= m_msgLimit[ic] && m_msgLimit[ic] != 0 ) ||
228  ( m_stats && itr->second.msg[ic] > 0 && ic >= m_statLevel.value() ) ) {
229  os << " ";
230  os.width( 28 );
231  os.setf( std::ios_base::left, std::ios_base::adjustfield );
232  os << itr->first;
233  os << "|";
234 
235  os.width( 8 );
236  os.setf( std::ios_base::right, std::ios_base::adjustfield );
237  os << levelNames[ic];
238  os << " |";
239 
240  os.width( 9 );
241  os << itr->second.msg[ic];
242  os << std::endl;
243 
244  found = true;
245  }
246  }
247  }
248  os << "=====================================================" << std::endl;
249  if ( found || m_stats ) std::cout << os.str() << std::flush;
250  }
251 
252 #ifndef NDEBUG
253  if ( m_inactCount.value() ) {
254 
255  std::ostringstream os;
256  os << "Listing sources of Unprotected and Unseen messages\n";
257 
258  bool found( false );
259 
260  unsigned int ml( 0 );
261  for ( const auto& itr : m_inactiveMap ) {
262  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
263  if ( itr.second.msg[ic] != 0 && itr.first.length() > ml ) { ml = itr.first.length(); }
264  }
265  }
266 
267  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
268 
269  os << std::endl << " ";
270  os.width( ml + 2 );
271  os.setf( std::ios_base::left, std::ios_base::adjustfield );
272  os << "Message Source";
273  os.width( 1 );
274  os << "| Level | Count" << std::endl;
275 
276  for ( unsigned int i = 0; i < ml + 3; ++i ) os << "-";
277  os << "+---------+-----------" << std::endl;
278 
279  for ( auto itr = m_inactiveMap.begin(); itr != m_inactiveMap.end(); ++itr ) {
280  for ( unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic ) {
281  if ( itr->second.msg[ic] != 0 ) {
282  os << " ";
283  os.width( ml + 2 );
284  os.setf( std::ios_base::left, std::ios_base::adjustfield );
285  os << itr->first;
286 
287  os << "|";
288 
289  os.width( 8 );
290  os.setf( std::ios_base::right, std::ios_base::adjustfield );
291  os << levelNames[ic];
292 
293  os << " |";
294 
295  os.width( 9 );
296  os << itr->second.msg[ic];
297 
298  os << std::endl;
299 
300  found = true;
301  }
302  }
303  }
304  for ( unsigned int i = 0; i < ml + 25; ++i ) os << "=";
305  os << std::endl;
306 
307  if ( found ) std::cout << os.str() << std::flush;
308  }
309 #endif
310 
311  return StatusCode::SUCCESS;
312 }
313 
314 void MessageSvc::reportMessage( const Message& msg, int outputLevel ) {
315  auto lock = std::scoped_lock{ m_reportMutex };
317 }
318 
319 void MessageSvc::i_reportMessage( const Message& msg, int outputLevel ) {
320  int key = msg.getType();
321 
322  ++m_msgCount[key];
323 
324  const Message* cmsg = &msg;
325 
326  // processing logged streams
327  if ( !m_loggedStreams.empty() ) {
328  auto iLog = m_loggedStreams.find( msg.getSource() );
329  if ( m_loggedStreams.end() != iLog ) { ( *iLog->second ) << *cmsg << std::endl; }
330  }
331 
332  if ( m_suppress.value() || m_stats.value() ) {
333 
334  // Increase the counter of 'key' type of messages for the source and
335  // get the new value.
336  const int nmsg = ++( m_sourceMap[msg.getSource()].msg[key] );
337 
338  if ( m_suppress.value() && m_msgLimit[key] != 0 ) {
339  if ( nmsg > m_msgLimit[key] ) return;
340  if ( nmsg == m_msgLimit[key] ) {
341  std::string txt = levelNames[key] + " message limit (" + std::to_string( m_msgLimit[key].value() ) +
342  ") reached for " + msg.getSource() + ". Suppressing further output.";
343  cmsg = new Message( msg.getSource(), MSG::WARNING, std::move( txt ) );
344  cmsg->setFormat( msg.getFormat() );
345  }
346  }
347  }
348 
349  auto range = m_streamMap.equal_range( key );
350  if ( range.first != m_streamMap.end() ) {
351  std::for_each( range.first, range.second,
352  [&]( StreamMap::const_reference sm ) { *sm.second.second << *cmsg << std::endl; } );
353  } else if ( key >= outputLevel ) {
354  msg.setFormat( m_defaultFormat );
355  msg.setTimeFormat( m_defaultTimeFormat );
356  if ( !m_color ) {
357  ( *m_defaultStream ) << *cmsg << std::endl << std::flush;
358  } else {
359  ( *m_defaultStream ) << m_logColorCodes[key] << *cmsg << "\033[m" << std::endl << std::flush;
360  }
361  }
362 
363  if ( cmsg != &msg ) { delete cmsg; } // cppcheck-suppress autovarInvalidDeallocation; false positive
364 }
365 
366 void MessageSvc::reportMessage( const Message& msg ) { reportMessage( msg, outputLevel( msg.getSource() ) ); }
367 
368 void MessageSvc::reportMessage( std::string source, int type, std::string message ) {
369  reportMessage( Message{ std::move( source ), type, std::move( message ) } );
370 }
371 
372 void MessageSvc::reportMessage( const StatusCode& code, std::string_view source ) {
373  auto lock = std::scoped_lock{ m_messageMapMutex };
374  i_reportMessage( code, source );
375 }
376 
377 void MessageSvc::i_reportMessage( const StatusCode& code, std::string_view source ) {
378  int level = outputLevel( source );
379  auto report = [&]( Message mesg ) {
380  mesg.setSource( source );
381  Message stat_code( std::string{ source }, mesg.getType(), "Status Code " + std::to_string( code.getCode() ) );
382  i_reportMessage( std::move( stat_code ), level );
383  i_reportMessage( std::move( mesg ), level );
384  };
385 
386  auto range = m_messageMap.equal_range( code );
387  if ( range.first != m_messageMap.end() ) {
388  std::for_each( range.first, range.second, [&]( MessageMap::const_reference sm ) { report( sm.second ); } );
389  } else {
390  report( m_defaultMessage );
391  }
392 }
393 
394 void MessageSvc::insertStream( int key, std::string name, std::ostream* stream ) {
395  m_streamMap.emplace( key, NamedStream( std::move( name ), stream ) );
396 }
397 
399 
400 void MessageSvc::eraseStream( int message_type ) { m_streamMap.erase( message_type ); }
401 
402 void MessageSvc::eraseStream( int key, std::ostream* stream ) {
403  if ( stream ) {
404  erase_if( m_streamMap, m_streamMap.equal_range( key ),
405  [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
406  }
407 }
408 
409 void MessageSvc::eraseStream( std::ostream* stream ) {
410  if ( stream ) {
411  erase_if( m_streamMap, [&]( StreamMap::const_reference j ) { return j.second.second == stream; } );
412  }
413 }
414 
416  auto lock = std::scoped_lock{ m_messageMapMutex };
417  m_messageMap.emplace( key, std::move( msg ) );
418 }
419 
421  auto lock = std::scoped_lock{ m_messageMapMutex };
422  m_messageMap.clear();
423 }
424 
426  auto lock = std::scoped_lock{ m_messageMapMutex };
427  m_messageMap.erase( key );
428 }
429 
431  auto lock = std::scoped_lock{ m_messageMapMutex };
432 
433  erase_if( m_messageMap, m_messageMap.equal_range( key ),
434  [&]( MessageMap::const_reference j ) { return j.second == msg; } );
435 }
436 
437 int MessageSvc::outputLevel() const { return m_outputLevel; }
438 
439 int MessageSvc::outputLevel( std::string_view source ) const {
440  auto lock = std::scoped_lock{ m_thresholdMapMutex };
441  auto it = m_thresholdMap.find( source );
442  return it != m_thresholdMap.end() ? it->second : m_outputLevel.value();
443 }
444 
445 void MessageSvc::setOutputLevel( int new_level ) { m_outputLevel = new_level; }
446 
447 void MessageSvc::setOutputLevel( std::string_view source, int level ) {
448  auto lock = std::scoped_lock{ m_thresholdMapMutex };
449 
450  // only write if we really have to...
451  auto i = m_thresholdMap.find( source );
452  if ( i == m_thresholdMap.end() ) {
453  m_thresholdMap.emplace( source, level );
454  } else if ( i->second != level ) {
455  i->second = level;
456  }
457 }
458 
459 std::string MessageSvc::getLogColor( int logLevel ) const {
460  return ( logLevel < MSG::NUM_LEVELS ) ? m_logColorCodes[logLevel] : "";
461 }
462 
464 
465 void MessageSvc::incrInactiveCount( MSG::Level level, std::string_view source ) {
466  auto entry = m_inactiveMap.find( source );
467  if ( entry == m_inactiveMap.end() ) { entry = m_inactiveMap.emplace( source, MsgAry{} ).first; }
468  ++entry->second.msg[level];
469 
470  if ( std::find( begin( m_tracedInactiveSources ), end( m_tracedInactiveSources ), source ) !=
472  std::cout << "== inactive message detected from " << source << " ==\n";
473  std::string t;
474  System::backTrace( t, 25, 0 );
475  std::cout << t << std::endl;
476  }
477 }
478 
480  // reset state
481  m_loggedStreams.clear();
482 
483  // make the unique set of output filenames
484  std::set<std::string_view> outFileNames;
485  std::transform( m_loggedStreamsName.begin(), m_loggedStreamsName.end(),
486  std::inserter( outFileNames, outFileNames.end() ),
487  []( const auto& p ) -> std::string_view { return p.second; } );
488  // map each unique filename to an ofstream
489  std::map<std::string_view, std::shared_ptr<std::ofstream>> outStreams;
490  std::transform( outFileNames.begin(), outFileNames.end(), std::inserter( outStreams, outStreams.end() ),
491  []( std::string_view fname ) {
492  return std::pair{ fname, std::make_shared<std::ofstream>(
493  std::string{ fname }, std::ios_base::out | std::ios_base::trunc ) };
494  } );
495  // associate the stream to ofstream...
496  for ( auto& iProp : m_loggedStreamsName ) {
497  auto& stream = outStreams.at( iProp.second );
498  if ( stream->good() ) m_loggedStreams.emplace( iProp.first, stream );
499  }
500 }
MSG::DEBUG
@ DEBUG
Definition: IMessageSvc.h:22
Gaudi::Details::PropertyBase
PropertyBase base class allowing PropertyBase* collections to be "homogeneous".
Definition: PropertyBase.h:34
Gaudi::Details::PropertyBase::name
const std::string name() const
property name
Definition: PropertyBase.h:38
MessageSvc::reinitialize
StatusCode reinitialize() override
Definition: MessageSvc.cpp:108
MessageSvc::m_logColors
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_logColors
Definition: MessageSvc.h:148
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:150
precedence.message
message
Definition: precedence.py:19
MessageSvc::m_stats
Gaudi::Property< bool > m_stats
Definition: MessageSvc.h:134
MsgStream::enableCountInactive
static GAUDI_API bool enableCountInactive(bool value=true)
Enable/disable the count of inactive messages.
Definition: MsgStream.cpp:21
Read.app
app
Definition: Read.py:36
Service::m_state
Gaudi::StateMachine::State m_state
Service state
Definition: Service.h:155
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
MSG::INFO
@ INFO
Definition: IMessageSvc.h:22
System.h
MessageSvc::MsgAry
Private helper class to keep the count of messages of a type (MSG::LEVEL).
Definition: MessageSvc.h:187
MessageSvc::m_defaultTimeFormat
Gaudi::Property< std::string > m_defaultTimeFormat
Definition: MessageSvc.h:133
MSG::BLACK
@ BLACK
Definition: IMessageSvc.h:23
MessageSvc::insertMessage
void insertMessage(const StatusCode &code, Message message) override
Definition: MessageSvc.cpp:415
ISvcLocator
Definition: ISvcLocator.h:42
GaudiException
Definition: GaudiException.h:29
MessageSvc::incrInactiveCount
void incrInactiveCount(MSG::Level level, std::string_view src) override
Definition: MessageSvc.cpp:465
MessageSvc::reportMessage
void reportMessage(const Message &message) override
Definition: MessageSvc.cpp:366
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
MessageSvc::m_logColorCodes
std::string m_logColorCodes[MSG::NUM_LEVELS]
Definition: MessageSvc.h:184
MessageSvc::m_reportMutex
std::recursive_mutex m_reportMutex
Mutex to synchronize multiple threads printing.
Definition: MessageSvc.h:208
MSG::WARNING
@ WARNING
Definition: IMessageSvc.h:22
MessageSvc.h
MSG::BLUE
@ BLUE
Definition: IMessageSvc.h:23
MessageSvc::i_reportMessage
virtual void i_reportMessage(const Message &msg, int outputLevel)
Internal implementation of reportMessage(const Message&,int) without lock.
Definition: MessageSvc.cpp:319
gaudirun.c
c
Definition: gaudirun.py:525
MessageSvc::messageCount
int messageCount(MSG::Level logLevel) const override
Definition: MessageSvc.cpp:463
System::backTrace
GAUDI_API int backTrace(void **addresses, const int depth)
StatusCode.h
IAppMgrUI.h
Gaudi::Property::setValue
bool setValue(const ValueType &v)
Definition: Property.h:231
MessageSvc::m_streamMap
StreamMap m_streamMap
Stream map.
Definition: MessageSvc.h:180
MessageSvc::m_thresholdMapMutex
std::recursive_mutex m_thresholdMapMutex
Mutex to synchronize multiple access to m_thresholdMap (.
Definition: MessageSvc.h:215
MSG::PURPLE
@ PURPLE
Definition: IMessageSvc.h:23
MessageSvc::m_msgLimit
std::array< Gaudi::Property< int >, MSG::NUM_LEVELS > m_msgLimit
Definition: MessageSvc.h:157
bug_34121.t
t
Definition: bug_34121.py:31
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:135
MessageSvc::m_statLevel
Gaudi::Property< unsigned int > m_statLevel
Definition: MessageSvc.h:135
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:333
StatusCode
Definition: StatusCode.h:64
Gaudi::cxx::for_each
void for_each(ContainerOfSynced &c, Fun &&f)
Definition: SynchronizedValue.h:98
Message
Definition: Message.h:25
ProduceConsume.j
j
Definition: ProduceConsume.py:104
MessageSvc::m_sourceMap
std::map< std::string, MsgAry, std::less<> > m_sourceMap
Definition: MessageSvc.h:194
CommonMessaging
Definition: CommonMessaging.h:65
Gaudi::StateMachine::OFFLINE
@ OFFLINE
Definition: StateMachine.h:22
Gaudi::Property::declareUpdateHandler
Details::PropertyBase & declareUpdateHandler(std::function< void(Details::PropertyBase &)> fun) override
set new callback for update
Definition: Property.h:135
MessageSvc::m_msgCount
std::array< int, MSG::NUM_LEVELS > m_msgCount
Definition: MessageSvc.h:196
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:229
Message::setFormat
void setFormat(std::string msg) const
Set the format string.
Definition: Message.cpp:97
MessageSvc::m_defaultMessage
Message m_defaultMessage
Default Message.
Definition: MessageSvc.h:179
MessageSvc::m_thresholdMap
ThresholdMap m_thresholdMap
Output level threshold map.
Definition: MessageSvc.h:182
SmartIF< IAppMgrUI >
MessageSvc::m_messageMap
MessageMap m_messageMap
Message map.
Definition: MessageSvc.h:181
MessageSvc::setupThreshold
void setupThreshold(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:169
gaudirun.level
level
Definition: gaudirun.py:364
MessageSvc::m_tracedInactiveSources
Gaudi::Property< std::vector< std::string > > m_tracedInactiveSources
Definition: MessageSvc.h:169
MSG::FATAL
@ FATAL
Definition: IMessageSvc.h:22
MessageSvc::m_inactiveMap
std::map< std::string, MsgAry, std::less<> > m_inactiveMap
Definition: MessageSvc.h:194
MessageSvc
Definition: MessageSvc.h:35
MessageSvc::outputLevel
int outputLevel() const override
Definition: MessageSvc.cpp:437
MessageSvc::finalize
StatusCode finalize() override
Definition: MessageSvc.cpp:207
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
MSG::RED
@ RED
Definition: IMessageSvc.h:23
MessageSvc::m_inactCount
Gaudi::Property< bool > m_inactCount
Definition: MessageSvc.h:167
MSG::Level
Level
Definition: IMessageSvc.h:22
gaudirun.type
type
Definition: gaudirun.py:160
MSG::VERBOSE
@ VERBOSE
Definition: IMessageSvc.h:22
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:99
ConditionsStallTest.name
name
Definition: ConditionsStallTest.py:77
MessageSvc::m_messageMapMutex
std::recursive_mutex m_messageMapMutex
Mutex to synchronize multiple access to m_messageMap.
Definition: MessageSvc.h:211
MSG::WHITE
@ WHITE
Definition: IMessageSvc.h:23
MessageSvc::NamedStream
std::pair< std::string, std::ostream * > NamedStream
Definition: MessageSvc.h:37
MessageSvc::m_loggedStreamsName
Gaudi::Property< std::map< std::string, std::string, std::less<> > > m_loggedStreamsName
Definition: MessageSvc.h:175
MSG::ALWAYS
@ ALWAYS
Definition: IMessageSvc.h:22
MessageSvc::setupInactCount
void setupInactCount(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:199
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:45
MessageSvc::eraseMessage
void eraseMessage() override
Definition: MessageSvc.cpp:420
MSG::NIL
@ NIL
Definition: IMessageSvc.h:22
Kernel.h
Gaudi::StateMachine::INITIALIZED
@ INITIALIZED
Definition: StateMachine.h:24
ProduceConsume.Message
Message
Definition: ProduceConsume.py:110
MSG::ERROR
@ ERROR
Definition: IMessageSvc.h:22
MSG::CYAN
@ CYAN
Definition: IMessageSvc.h:23
MSG::GREEN
@ GREEN
Definition: IMessageSvc.h:23
MessageSvc::m_color
Gaudi::Property< bool > m_color
Definition: MessageSvc.h:146
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:198
MessageSvc::initialize
StatusCode initialize() override
Definition: MessageSvc.cpp:94
IOTest.end
end
Definition: IOTest.py:125
MessageSvc::getLogColor
std::string getLogColor(int logLevel) const override
Definition: MessageSvc.cpp:459
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:100
MessageSvc::eraseStream
void eraseStream() override
Definition: MessageSvc.cpp:398
MessageSvc::m_thresholdProp
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_thresholdProp
Definition: MessageSvc.h:137
MessageSvc::setupLogStreams
void setupLogStreams()
Definition: MessageSvc.cpp:479
MessageSvc::MessageSvc
MessageSvc(const std::string &name, ISvcLocator *svcloc)
Definition: MessageSvc.cpp:69
MessageSvc::m_suppress
Gaudi::Property< bool > m_suppress
Definition: MessageSvc.h:166
MSG::NUM_LEVELS
@ NUM_LEVELS
Definition: IMessageSvc.h:22
MessageSvc::insertStream
void insertStream(int message_type, std::string name, std::ostream *stream) override
Definition: MessageSvc.cpp:394
MessageSvc::m_defaultFormat
Gaudi::Property< std::string > m_defaultFormat
Definition: MessageSvc.h:132
MessageSvc::setOutputLevel
void setOutputLevel(int new_level) override
Definition: MessageSvc.cpp:445
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:184
Gaudi::Property< int >
MSG::YELLOW
@ YELLOW
Definition: IMessageSvc.h:23
Gaudi::Functional::details::zip::range
decltype(auto) range(Args &&... args)
Zips multiple containers together to form a single range.
Definition: details.h:102
Message.h
Iterator
boost::spirit::classic::position_iterator2< ForwardIterator > Iterator
Definition: Iterator.h:18
MessageSvc::setupColors
void setupColors(Gaudi::Details::PropertyBase &prop)
Definition: MessageSvc.cpp:116