ATLAS Offline Software
Loading...
Searching...
No Matches
TrigMessageSvc Class Reference

MessageSvc used by the HLT applications. More...

#include <TrigMessageSvc.h>

Inheritance diagram for TrigMessageSvc:

Classes

struct  MsgAry
 Private helper class to keep the count of messages of a type (MSG::LEVEL). More...

Public Types

typedef std::map< std::string, int, std::less<> > ThresholdMap

Public Member Functions

 TrigMessageSvc (const std::string &name, ISvcLocator *svcloc)
virtual StatusCode reinitialize () override
virtual StatusCode initialize () override
virtual StatusCode start () override
virtual StatusCode stop () override
virtual StatusCode finalize () override
virtual void handle (const Incident &incident) override
virtual void reportMessage (const Message &message) override
virtual void reportMessage (const Message &msg, int outputLevel) override
virtual void reportMessage (std::string source, int type, std::string message) override
virtual std::ostream *defaultStream ATLAS_NOT_CONST_THREAD_SAFE () const override
virtual void setDefaultStream (std::ostream *stream) override
virtual int outputLevel () const override
virtual int outputLevel (std::string_view source) const override
virtual void setOutputLevel (int new_level) override
virtual void setOutputLevel (std::string_view source, int new_level) override
virtual int messageCount (MSG::Level logLevel) const override
virtual bool useColor () const override
virtual std::string getLogColor (int) const override
virtual void reportMessage (const StatusCode &, std::string_view) override
 Not supported by this implementation.
virtual void insertMessage (const StatusCode &, Message) override
virtual void eraseMessage () override
virtual void eraseMessage (const StatusCode &) override
virtual void eraseMessage (const StatusCode &, const Message &) override
virtual void insertStream (int, std::string, std::ostream *) override
virtual void eraseStream () override
virtual void eraseStream (int) override
virtual void eraseStream (int, std::ostream *) override
virtual void eraseStream (std::ostream *) override

Private Member Functions

void setupLimits (Gaudi::Details::PropertyBase &prop)
void setupThreshold (Gaudi::Details::PropertyBase &prop)
bool passErsFilter (const std::string &source, const std::vector< std::string > &filter) const
bool passErsLimit (const Message &msg)
void i_reportMessage (const Message &msg, int outputLevel)
 Internal implementation of reportMessage(const Message&,int) without lock.
void i_reportERS (const Message &msg) const
 Report message to online messaging system (ERS)
void asyncReporting ()
void bookHistograms ()

Private Attributes

Gaudi::Property< std::string > m_defaultFormat
Gaudi::Property< std::string > m_ersFormat
Gaudi::Property< std::string > m_defaultTimeFormat
Gaudi::Property< bool > m_stats {this, "showStats", false, "Show message statistics"}
Gaudi::Property< unsigned int > m_statLevel
Gaudi::Property< unsigned int > m_publishLevel
Gaudi::Property< unsigned int > m_eventIDLevel
Gaudi::Property< bool > m_color
Gaudi::Property< bool > m_suppress {this, "enableSuppression", false, "Enable message suppression"}
Gaudi::Property< bool > m_suppressRunningOnly
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_thresholdProp
std::array< Gaudi::Property< int >, MSG::NUM_LEVELS > m_msgLimit
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_useERS
 Special properties to control output to ERS of individual sources.
Gaudi::Property< int > m_ersEventLimit
std::ostream * m_defaultStream = &std::cout
 Pointer to the output stream.
ThresholdMap m_thresholdMap
 Output level threshold map.
std::map< std::string, MsgArym_sourceMap
 counts per source
std::array< int, MSG::NUM_LEVELS > m_msgCount {}
 counts per level
std::map< size_t, unsigned int > m_msgHashCount
 counts per message hash
std::unordered_map< EventContext::ContextID_t, std::pair< EventContext::ContextEvt_t, MsgAry > > m_slotMsgCount
 counts per slot and level
bool m_doPublish {false}
 are we publishing message statistics?
bool m_doSuppress {false}
 is suppression currently enabled?
TH1I * m_msgCountHist {nullptr}
 Message counting per level histogram.
TH2I * m_msgCountSrcHist {nullptr}
 Message counting per message source.
std::recursive_mutex m_thresholdMapMutex
bool m_asyncReporting {false}
 (
std::thread m_thread
 Thread for asynchronous reporting.
tbb::concurrent_bounded_queue< std::function< void()> > m_messageActionsQueue

Detailed Description

MessageSvc used by the HLT applications.

This MessageSvc implementation it used by the HLT applications. It has some additional features compared to the default Gaudi MessageSvc. Most notably the forwarding of messages to the TDAQ ERS message system.

The message suppression is configured with the following parameters:

Parameters
<level>Limit= 0: no message suppression for <level>
<level>Limit= N > 0: suppress messages after N messages (per source)
<level>Limit= -N < 0: use logarithmic suppression after N messages (per message)

Note, that the logarithmic suppression works on a per-message basis (ignoring any digits in the message).

Author
Iain Last, Werner Wiedenmann, Frank Winklmeier

Definition at line 56 of file TrigMessageSvc.h.

Member Typedef Documentation

◆ ThresholdMap

typedef std::map<std::string, int, std::less<> > TrigMessageSvc::ThresholdMap

Definition at line 58 of file TrigMessageSvc.h.

Constructor & Destructor Documentation

◆ TrigMessageSvc()

TrigMessageSvc::TrigMessageSvc ( const std::string & name,
ISvcLocator * svcloc )

Definition at line 38 of file TrigMessageSvc.cxx.

38 :
39 base_class(name, svcloc)
40{
41 m_outputLevel.declareUpdateHandler([svcloc](Gaudi::Details::PropertyBase&) {
42 SmartIF<IAppMgrUI> app = svcloc;
43 if (app) app->outputLevelUpdate();
44 });
45
46 for (int ic = 0; ic < MSG::NUM_LEVELS; ++ic) {
47 m_msgLimit[ic].declareUpdateHandler(&TrigMessageSvc::setupLimits, this);
48 m_thresholdProp[ic].declareUpdateHandler(&TrigMessageSvc::setupThreshold, this);
49 }
50
51 std::fill(std::begin(m_msgCount), std::end(m_msgCount), 0);
52}
void setupLimits(Gaudi::Details::PropertyBase &prop)
std::array< Gaudi::Property< int >, MSG::NUM_LEVELS > m_msgLimit
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_thresholdProp
void setupThreshold(Gaudi::Details::PropertyBase &prop)
std::array< int, MSG::NUM_LEVELS > m_msgCount
counts per level
int ic
Definition grepfile.py:33

Member Function Documentation

◆ asyncReporting()

void TrigMessageSvc::asyncReporting ( )
private

Definition at line 269 of file TrigMessageSvc.cxx.

270{
271 m_asyncReporting = true;
272 std::function<void()> action;
273 while ( m_asyncReporting || !m_messageActionsQueue.empty() ) {
274 m_messageActionsQueue.pop(action);
275 action();
276 }
277}
tbb::concurrent_bounded_queue< std::function< void()> > m_messageActionsQueue

◆ ATLAS_NOT_CONST_THREAD_SAFE()

virtual std::ostream *defaultStream TrigMessageSvc::ATLAS_NOT_CONST_THREAD_SAFE ( ) const
inlineoverridevirtual

Definition at line 72 of file TrigMessageSvc.h.

73 {
74 return m_defaultStream;
75 }
std::ostream * m_defaultStream
Pointer to the output stream.

◆ bookHistograms()

void TrigMessageSvc::bookHistograms ( )
private

Definition at line 114 of file TrigMessageSvc.cxx.

115{
116 ServiceHandle<ITHistSvc> histSvc("THistSvc", name());
117 if ( histSvc.retrieve().isFailure() ) {
118 reportMessage(name(), MSG::WARNING, "Cannot find THistSvc. Message stats will not be published.");
119 m_doPublish = false;
120 return;
121 }
122
123 // monitoring information root directory
124 const std::string path = "/EXPERT/HLTFramework/" + name() + "/";
125 const int nLevelBins = MSG::NUM_LEVELS - m_publishLevel;
126 m_msgCountHist = new TH1I("MessageCount", "Messages while RUNNING;Severity;Count",
127 nLevelBins, 0, nLevelBins);
128
129 const int nSrcBins = 1;
130 m_msgCountSrcHist = new TH2I("MessageCountBySource", "Messages while RUNNING;Severity;Source",
131 nLevelBins, 0, nLevelBins, nSrcBins, 0, nSrcBins);
132
133 for (int i=m_publishLevel; i<MSG::NUM_LEVELS; i++) {
134 m_msgCountHist->GetXaxis()->SetBinLabel(i-m_publishLevel+1, levelNames[i].c_str());
135 m_msgCountSrcHist->GetXaxis()->SetBinLabel(i-m_publishLevel+1, levelNames[i].c_str());
136 }
137
138 if ( histSvc->regHist(path + m_msgCountHist->GetName(), m_msgCountHist).isFailure() ) {
139 reportMessage(name(), MSG::WARNING, "Cannot register monitoring histogram 'MessageCount'");
140 }
141 if ( histSvc->regHist(path + m_msgCountSrcHist->GetName(), m_msgCountSrcHist).isFailure() ) {
142 reportMessage(name(), MSG::WARNING, "Cannot register monitoring histogram 'MessageCountBySource'");
143 }
144}
static const std::string levelNames[MSG::NUM_LEVELS]
virtual void reportMessage(const Message &message) override
TH1I * m_msgCountHist
Message counting per level histogram.
bool m_doPublish
are we publishing message statistics?
TH2I * m_msgCountSrcHist
Message counting per message source.
Gaudi::Property< unsigned int > m_publishLevel
path
python interpreter configuration --------------------------------------—
Definition athena.py:128

◆ eraseMessage() [1/3]

virtual void TrigMessageSvc::eraseMessage ( )
inlineoverridevirtual

Definition at line 94 of file TrigMessageSvc.h.

94{ NOTSUPPORTED; }
#define NOTSUPPORTED

◆ eraseMessage() [2/3]

virtual void TrigMessageSvc::eraseMessage ( const StatusCode & )
inlineoverridevirtual

Definition at line 95 of file TrigMessageSvc.h.

95{ NOTSUPPORTED; }

◆ eraseMessage() [3/3]

virtual void TrigMessageSvc::eraseMessage ( const StatusCode & ,
const Message &  )
inlineoverridevirtual

Definition at line 96 of file TrigMessageSvc.h.

96{ NOTSUPPORTED; }

◆ eraseStream() [1/4]

virtual void TrigMessageSvc::eraseStream ( )
inlineoverridevirtual

Definition at line 98 of file TrigMessageSvc.h.

98{ NOTSUPPORTED; }

◆ eraseStream() [2/4]

virtual void TrigMessageSvc::eraseStream ( int )
inlineoverridevirtual

Definition at line 99 of file TrigMessageSvc.h.

99{ NOTSUPPORTED; }

◆ eraseStream() [3/4]

virtual void TrigMessageSvc::eraseStream ( int ,
std::ostream *  )
inlineoverridevirtual

Definition at line 100 of file TrigMessageSvc.h.

100{ NOTSUPPORTED; }

◆ eraseStream() [4/4]

virtual void TrigMessageSvc::eraseStream ( std::ostream * )
inlineoverridevirtual

Definition at line 101 of file TrigMessageSvc.h.

101{ NOTSUPPORTED; }

◆ finalize()

StatusCode TrigMessageSvc::finalize ( )
overridevirtual

Definition at line 207 of file TrigMessageSvc.cxx.

208{
209 m_suppress = false;
210 std::ostringstream os;
211
212 if (m_stats) {
213 os << "Summarizing all message counts"
214 << " (severity >= " << levelNames[m_statLevel] << ")" << std::endl;
215 }
216 else {
217 os << "Listing sources of suppressed message: " << std::endl;
218 }
219
220 os << "=====================================================" << std::endl;
221 os << " Message Source | Level | Count" << std::endl;
222 os << "-----------------------------+---------+-------------" << std::endl;
223
224 bool found(false);
225
226 for (auto itr = m_sourceMap.begin(); itr != m_sourceMap.end(); ++itr) {
227 for (unsigned int ic = 0; ic < MSG::NUM_LEVELS; ++ic) {
228 if ((m_suppress && itr->second.msg[ic] >= abs(m_msgLimit[ic]) && m_msgLimit[ic] != 0) ||
229 (m_stats && itr->second.msg[ic] > 0 && ic >= m_statLevel.value())) {
230 os << " ";
231 os.width(28);
232 os.setf(std::ios_base::left, std::ios_base::adjustfield);
233 os << itr->first;
234 os << "|";
235
236 os.width(8);
237 os.setf(std::ios_base::right, std::ios_base::adjustfield);
238 os << levelNames[ic];
239 os << " |";
240
241 os.width(9);
242 os << itr->second.msg[ic];
243 os << std::endl;
244
245 found = true;
246 }
247 }
248 }
249 os << "=====================================================" << std::endl;
250 if (found || m_stats) {
251 reportMessage(name(), MSG::INFO, os.str());
252 }
253
254 return StatusCode::SUCCESS;
255}
std::map< std::string, MsgAry > m_sourceMap
counts per source
Gaudi::Property< bool > m_stats
Gaudi::Property< unsigned int > m_statLevel
Gaudi::Property< bool > m_suppress

◆ getLogColor()

virtual std::string TrigMessageSvc::getLogColor ( int ) const
inlineoverridevirtual

Definition at line 89 of file TrigMessageSvc.h.

89{ return ""; }

◆ handle()

void TrigMessageSvc::handle ( const Incident & incident)
overridevirtual

Definition at line 106 of file TrigMessageSvc.cxx.

107{
108 if (incident.type() == AthenaInterprocess::UpdateAfterFork::type()) {
109 reportMessage(name(), MSG::INFO, "Enabling asynchronous message reporting");
110 m_thread = std::thread( &TrigMessageSvc::asyncReporting, this);
111 }
112}
static const std::string & type()
Incident type.
Definition Incidents.h:49
std::thread m_thread
Thread for asynchronous reporting.

◆ i_reportERS()

void TrigMessageSvc::i_reportERS ( const Message & msg) const
private

Report message to online messaging system (ERS)

Definition at line 375 of file TrigMessageSvc.cxx.

376{
377 /*
378 * Create ERS context object
379 *
380 * The (cross-node) MRS throttling is based on filename+line_number, i.e.
381 * ignoring the message text itself. We therefor use the message source as
382 * filename and the message hash as line_number. That way the same message
383 * from different nodes gets properly throttled by MRS.
384 */
385 const char* filename = msg.getSource().c_str();
386 const char* function_name = "";
387 const int line_number = msgHash(msg);
388 const char* package_name = "HLT";
389 ers::LocalContext hlt_context_info(package_name, filename, line_number, function_name);
390
391 // Create ERS issue object
392 Message m(msg);
393 if (m_eventIDLevel != MSG::NIL && msg.getType() >= static_cast<int>(m_eventIDLevel)) {
394 m.setFormat(m_ersFormat + " %E");
395 }
396 else {
397 m.setFormat(m_ersFormat);
398 }
399 std::ostringstream oss;
400 oss << m;
401 ers::HLTMessage ersMsg(hlt_context_info, oss.str());
402 ersMsg.add_qualifier("HLT"); // useful for filtering
403
404 // Forward Message to ERS
405 switch (msg.getType()) {
406 case MSG::NIL: break;
407 case MSG::VERBOSE: ers::debug(ersMsg, 2); break;
408 case MSG::DEBUG: ers::debug(ersMsg, 1); break;
409 case MSG::INFO: ers::info(ersMsg); break;
410 case MSG::WARNING: ers::warning(ersMsg); break;
411 case MSG::ERROR: ers::error(ersMsg); break;
412 case MSG::FATAL: ers::fatal(ersMsg); break;
413 default:
414 std::ostringstream oss;
415 oss << "Unknown message severity level: " << msg.getType() << " Original message was: " << m;
416 ers::error(ers::HLTMessage(ERS_HERE, oss.str()));
417 }
418}
Gaudi::Property< std::string > m_ersFormat
Gaudi::Property< unsigned int > m_eventIDLevel
static char * package_name
Definition cmdline.cxx:754
Message
Definition run.py:57
MsgStream & msg
Definition testRead.cxx:32

◆ i_reportMessage()

void TrigMessageSvc::i_reportMessage ( const Message & msg,
int outputLevel )
private

Internal implementation of reportMessage(const Message&,int) without lock.

Definition at line 283 of file TrigMessageSvc.cxx.

284{
285 const int key = msg.getType();
286 ++m_msgCount[key];
287
288 const Message* cmsg = &msg;
289 bool doPrint = true;
290 std::unique_ptr<Message> newMessage;
291
292 if (m_doSuppress || m_stats.value()) {
293
294 // Increase the counter of 'key' type of messages for the source and
295 // get the new value.
296 int nmsg = ++(m_sourceMap[msg.getSource()].msg[key]);
297
298 const int msgLimit = m_msgLimit[key].value();
299 if (m_doSuppress) {
300 if (msgLimit > 0) { // regular suppression
301 if (nmsg > msgLimit) doPrint = false;
302 if (nmsg == msgLimit) {
303 std::string txt = levelNames[key] + " message limit (" + std::to_string(msgLimit) +
304 ") reached for " + msg.getSource() + ". Suppressing further output.";
305 newMessage = std::make_unique<Message>(msg.getSource(), MSG::WARNING, std::move(txt));
306 cmsg = newMessage.get();
307 }
308 }
309 }
310 else if (msgLimit < 0) { // logarithmic suppression
311 // Calculate message hash
312 const unsigned int mh = msgHash(*cmsg);
313 // Check if we saw this message already and increase counter
314 auto m = m_msgHashCount.find(mh);
315 if (m != m_msgHashCount.end()) {
316 nmsg = ++m->second;
317 }
318 else {
319 nmsg = m_msgHashCount[mh] = 1;
320 }
321 if (nmsg == abs(msgLimit)) {
322 std::ostringstream os;
323 os << msg.getMessage() << " [Message limit (" << abs(msgLimit)
324 << ") reached. Log-suppression of further output.]";
325 newMessage = std::make_unique<Message>(msg.getSource(), msg.getType(), os.str());
326 cmsg = newMessage.get();
327 }
328 else if (nmsg > abs(msgLimit)) {
329 const int everyNth = (int)exp10((int)log10(nmsg));
330 if ((nmsg % everyNth) == 0) {
331 std::ostringstream os;
332 os << msg.getMessage() << " [suppressed " << everyNth << " similar messages]";
333 newMessage = std::make_unique<Message>(msg.getSource(), msg.getType(), os.str());
334 cmsg = newMessage.get();
335 }
336 }
337 }
338 }
339
340 // Print the message
341 if (doPrint && key >= outputLevel) {
342 if (m_eventIDLevel != MSG::NIL && key >= static_cast<int>(m_eventIDLevel)) {
343 cmsg->setFormat(m_defaultFormat + " %E");
344 }
345 else {
346 cmsg->setFormat(m_defaultFormat);
347 }
348 cmsg->setTimeFormat(m_defaultTimeFormat);
349 (*m_defaultStream) << *cmsg << std::endl << std::flush;
350
351 // ERS forwarding
352 if (passErsFilter(cmsg->getSource(), m_useERS[key]) && passErsLimit(*cmsg)) {
353 i_reportERS(*cmsg);
354 }
355 }
356
357 // Publish message statistics if enabled and only while RUNNING
358 if ( m_doPublish && key>=static_cast<int>(m_publishLevel) ) {
359 m_msgCountHist->Fill(key-m_publishLevel, 1);
360 if (ATH_UNLIKELY(m_msgCountSrcHist->GetYaxis()->FindFixBin(msg.getSource().c_str())<0)) {
361 // Adding bins on the fly needs to be protected by mutex
362 oh_scoped_lock_histogram lock;
363 m_msgCountSrcHist->Fill(key-m_publishLevel, msg.getSource().c_str(), 1);
364 m_msgCountSrcHist->LabelsDeflate("Y");
365 }
366 else {
367 m_msgCountSrcHist->Fill(key-m_publishLevel, msg.getSource().c_str(), 1);
368 }
369 }
370}
#define ATH_UNLIKELY(x)
bool passErsFilter(const std::string &source, const std::vector< std::string > &filter) const
virtual int outputLevel() const override
bool passErsLimit(const Message &msg)
Gaudi::Property< std::string > m_defaultTimeFormat
std::map< size_t, unsigned int > m_msgHashCount
counts per message hash
std::array< Gaudi::Property< std::vector< std::string > >, MSG::NUM_LEVELS > m_useERS
Special properties to control output to ERS of individual sources.
void i_reportERS(const Message &msg) const
Report message to online messaging system (ERS)
Gaudi::Property< std::string > m_defaultFormat
bool m_doSuppress
is suppression currently enabled?

◆ initialize()

StatusCode TrigMessageSvc::initialize ( )
overridevirtual

Definition at line 54 of file TrigMessageSvc.cxx.

55{
56 StatusCode sc = Service::initialize();
57 if (sc.isFailure()) return sc;
58
59 ServiceHandle<IIncidentSvc> incSvc("IncidentSvc", name());
60 sc = incSvc.retrieve();
61 if (sc.isFailure()) {
62 reportMessage(name(), MSG::WARNING, "Cannot find IncidentSvc");
63 }
64 else {
65 incSvc->addListener(this, AthenaInterprocess::UpdateAfterFork::type());
66 }
67
69
70 if (m_color) {
71 std::cout << "TrigMessageSvc WARNING: Colors are not supported by TrigMessageSvc" << std::endl;
72 }
73 return StatusCode::SUCCESS;
74}
static Double_t sc
Gaudi::Property< bool > m_color
Gaudi::Property< bool > m_suppressRunningOnly
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ insertMessage()

virtual void TrigMessageSvc::insertMessage ( const StatusCode & ,
Message  )
inlineoverridevirtual

Definition at line 93 of file TrigMessageSvc.h.

93{ NOTSUPPORTED; }

◆ insertStream()

virtual void TrigMessageSvc::insertStream ( int ,
std::string ,
std::ostream *  )
inlineoverridevirtual

Definition at line 97 of file TrigMessageSvc.h.

97{ NOTSUPPORTED; }

◆ messageCount()

int TrigMessageSvc::messageCount ( MSG::Level logLevel) const
overridevirtual

Definition at line 460 of file TrigMessageSvc.cxx.

◆ outputLevel() [1/2]

int TrigMessageSvc::outputLevel ( ) const
overridevirtual

Definition at line 430 of file TrigMessageSvc.cxx.

431{
432 return m_outputLevel;
433}

◆ outputLevel() [2/2]

int TrigMessageSvc::outputLevel ( std::string_view source) const
overridevirtual

Definition at line 435 of file TrigMessageSvc.cxx.

436{
437 std::unique_lock<std::recursive_mutex> lock(m_thresholdMapMutex);
438 auto it = m_thresholdMap.find(source);
439 return it != m_thresholdMap.end() ? it->second : m_outputLevel.value();
440}
std::recursive_mutex m_thresholdMapMutex
ThresholdMap m_thresholdMap
Output level threshold map.

◆ passErsFilter()

bool TrigMessageSvc::passErsFilter ( const std::string & source,
const std::vector< std::string > & filter ) const
private

Definition at line 465 of file TrigMessageSvc.cxx.

467{
468 if (filter.empty()) return false; // forward none
469 auto it = filter.begin();
470 if (filter.size() == 1 && (*it) == "*") return true; // forward all
471
472 bool pass(false);
473 for (; it != filter.end(); ++it) {
474 if ((*it) == "*") pass = true; // forward except if there is a veto later
475 if (source == (*it)) return true; // forward specific source
476 if ("!" + source == (*it)) return false; // veto specific source
477 }
478 return pass;
479}

◆ passErsLimit()

bool TrigMessageSvc::passErsLimit ( const Message & msg)
private

Definition at line 481 of file TrigMessageSvc.cxx.

482{
483 if (m_ersEventLimit < 0) return true;
484
485 const EventContext::ContextID_t slot = msg.getEventSlot();
486 const EventContext::ContextEvt_t evt = msg.getEventNumber();
487 // get or create message statistics for this slot
488 auto [itr, inserted] = m_slotMsgCount.insert( {slot, {evt, MsgAry()} } );
489
490 // if new event in slot then reset counters
491 if ( itr->second.first != evt ) {
492 itr->second = {evt, MsgAry()};
493 }
494
495 // increment number of messages for this level and slot
496 const int N = ++itr->second.second.msg[msg.getType()];
497
498 return N <= m_ersEventLimit;
499}
std::unordered_map< EventContext::ContextID_t, std::pair< EventContext::ContextEvt_t, MsgAry > > m_slotMsgCount
counts per slot and level
Gaudi::Property< int > m_ersEventLimit
Private helper class to keep the count of messages of a type (MSG::LEVEL).

◆ reinitialize()

StatusCode TrigMessageSvc::reinitialize ( )
overridevirtual

Definition at line 76 of file TrigMessageSvc.cxx.

77{
78 m_state = Gaudi::StateMachine::OFFLINE;
80 if ( sc.isSuccess() ) m_state = Gaudi::StateMachine::INITIALIZED;
81 return sc;
82}
virtual StatusCode initialize() override

◆ reportMessage() [1/4]

void TrigMessageSvc::reportMessage ( const Message & message)
overridevirtual

Definition at line 420 of file TrigMessageSvc.cxx.

421{
422 reportMessage(msg, outputLevel(msg.getSource()));
423}

◆ reportMessage() [2/4]

void TrigMessageSvc::reportMessage ( const Message & msg,
int outputLevel )
overridevirtual

Definition at line 257 of file TrigMessageSvc.cxx.

258{
259 if (m_asyncReporting) {
260 // msg has to be copied as the reference may become invalid by the time it is used
261 m_messageActionsQueue.emplace([this, m=Message(msg), outputLevel]() {
262 this->i_reportMessage(m, outputLevel); });
263 }
264 else {
266 }
267}
void i_reportMessage(const Message &msg, int outputLevel)
Internal implementation of reportMessage(const Message&,int) without lock.

◆ reportMessage() [3/4]

virtual void TrigMessageSvc::reportMessage ( const StatusCode & ,
std::string_view  )
inlineoverridevirtual

Not supported by this implementation.

Definition at line 92 of file TrigMessageSvc.h.

92{ NOTSUPPORTED; }

◆ reportMessage() [4/4]

void TrigMessageSvc::reportMessage ( std::string source,
int type,
std::string message )
overridevirtual

Definition at line 425 of file TrigMessageSvc.cxx.

426{
427 reportMessage(Message{std::move(source), type, std::move(message)});
428}

◆ setDefaultStream()

virtual void TrigMessageSvc::setDefaultStream ( std::ostream * stream)
inlineoverridevirtual

Definition at line 77 of file TrigMessageSvc.h.

◆ setOutputLevel() [1/2]

void TrigMessageSvc::setOutputLevel ( int new_level)
overridevirtual

Definition at line 442 of file TrigMessageSvc.cxx.

443{
444 m_outputLevel = new_level;
445}

◆ setOutputLevel() [2/2]

void TrigMessageSvc::setOutputLevel ( std::string_view source,
int new_level )
overridevirtual

Definition at line 447 of file TrigMessageSvc.cxx.

448{
449 std::unique_lock<std::recursive_mutex> lock(m_thresholdMapMutex);
450
451 // only write if we really have to...
452 auto i = m_thresholdMap.find( source );
453 if ( i == m_thresholdMap.end() ) {
454 m_thresholdMap.emplace( source, level );
455 } else if ( i->second != level ) {
456 i->second = level;
457 }
458}

◆ setupLimits()

void TrigMessageSvc::setupLimits ( Gaudi::Details::PropertyBase & prop)
private

Definition at line 147 of file TrigMessageSvc.cxx.

148{
149 // Just report problems in the settings of the limits and unknown limit
150 // parameters
151 if (prop.name() == "alwaysLimit") {
152 Gaudi::Property<int>* p = dynamic_cast<Gaudi::Property<int>*>(&prop);
153 if (p && p->value() != 0) {
154 std::cout << "TrigMessageSvc ERROR: cannot suppress ALWAYS messages" << std::endl;
155 p->setValue(0);
156 }
157 }
158 else if (prop.name() == "defaultLimit") {
159 for (int i = MSG::VERBOSE; i < MSG::NUM_LEVELS; ++i) {
160 if (i != MSG::ALWAYS) {
161 m_msgLimit[i] = m_msgLimit[MSG::NIL].value();
162 }
163 }
164 }
165 else if (prop.name() != "fatalLimit" && prop.name() != "errorLimit" &&
166 prop.name() != "warningLimit" && prop.name() == "infoLimit" &&
167 prop.name() == "debugLimit" && prop.name() == "verboseLimit") {
168 std::cout << "TrigMessageSvc ERROR: Unknown message limit parameter: " << prop.name()
169 << std::endl;
170 return;
171 }
172}

◆ setupThreshold()

void TrigMessageSvc::setupThreshold ( Gaudi::Details::PropertyBase & prop)
private

Definition at line 174 of file TrigMessageSvc.cxx.

175{
176 static const std::array<std::pair<const char*, MSG::Level>, 7> tbl{{{"setFatal", MSG::FATAL},
177 {"setError", MSG::ERROR},
178 {"setWarning", MSG::WARNING},
179 {"setInfo", MSG::INFO},
180 {"setDebug", MSG::DEBUG},
181 {"setVerbose", MSG::VERBOSE},
182 {"setAlways", MSG::ALWAYS}}};
183
184 auto i = std::find_if(
185 std::begin(tbl), std::end(tbl),
186 [&](const std::pair<const char*, MSG::Level>& t) { return prop.name() == t.first; });
187 if (i == std::end(tbl)) {
188 std::cerr << "TrigMessageSvc ERROR: Unknown message threshold parameter: " << prop.name()
189 << std::endl;
190 return;
191 }
192 int ic = i->second;
193
194 Gaudi::Property<std::vector<std::string>>* sap =
195 dynamic_cast<Gaudi::Property<std::vector<std::string>>*>(&prop);
196 if (!sap) {
197 std::cerr << "could not dcast " << prop.name()
198 << " to a Gaudi::Property<std::vector<std::string>> (which it "
199 "should be!)"
200 << std::endl;
201 }
202 else {
203 for (auto& i : sap->value()) setOutputLevel(i, ic);
204 }
205}
virtual void setOutputLevel(int new_level) override

◆ start()

StatusCode TrigMessageSvc::start ( )
overridevirtual

Definition at line 84 of file TrigMessageSvc.cxx.

85{
87 m_doPublish = true;
89 return StatusCode::SUCCESS;
90}

◆ stop()

StatusCode TrigMessageSvc::stop ( )
overridevirtual

Definition at line 92 of file TrigMessageSvc.cxx.

93{
94 // Disable asynchronous reporting again
95 if (m_asyncReporting) {
96 m_messageActionsQueue.emplace( [this]() {m_asyncReporting = false;} );
97 reportMessage(name(), MSG::INFO, "Disabling asynchronous message reporting");
98 m_thread.join();
99 }
100
101 m_doPublish = false;
103 return StatusCode::SUCCESS;
104}

◆ useColor()

virtual bool TrigMessageSvc::useColor ( ) const
inlineoverridevirtual

Definition at line 88 of file TrigMessageSvc.h.

88{ return m_color; }

Member Data Documentation

◆ m_asyncReporting

bool TrigMessageSvc::m_asyncReporting {false}
private

(

See also
MsgStream::doOutput). Async reporting active

Definition at line 196 of file TrigMessageSvc.h.

196{false};

◆ m_color

Gaudi::Property<bool> TrigMessageSvc::m_color
private
Initial value:
{this, "useColors", false,
"Colors are not supported by TrigMessageSvc"}

Definition at line 121 of file TrigMessageSvc.h.

121 {this, "useColors", false,
122 "Colors are not supported by TrigMessageSvc"};

◆ m_defaultFormat

Gaudi::Property<std::string> TrigMessageSvc::m_defaultFormat
private
Initial value:
{this, "Format", Message::getDefaultFormat(),
"Default message format"}

Definition at line 108 of file TrigMessageSvc.h.

108 {this, "Format", Message::getDefaultFormat(),
109 "Default message format"};

◆ m_defaultStream

std::ostream* TrigMessageSvc::m_defaultStream = &std::cout
private

Pointer to the output stream.

Definition at line 171 of file TrigMessageSvc.h.

◆ m_defaultTimeFormat

Gaudi::Property<std::string> TrigMessageSvc::m_defaultTimeFormat
private
Initial value:
{
this, "timeFormat", Message::getDefaultTimeFormat(), "Message time format"}

Definition at line 112 of file TrigMessageSvc.h.

112 {
113 this, "timeFormat", Message::getDefaultTimeFormat(), "Message time format"};

◆ m_doPublish

bool TrigMessageSvc::m_doPublish {false}
private

are we publishing message statistics?

Definition at line 188 of file TrigMessageSvc.h.

188{false};

◆ m_doSuppress

bool TrigMessageSvc::m_doSuppress {false}
private

is suppression currently enabled?

Definition at line 189 of file TrigMessageSvc.h.

189{false};

◆ m_ersEventLimit

Gaudi::Property<int> TrigMessageSvc::m_ersEventLimit
private
Initial value:
{this, "ersPerEventLimit", -1,
"Maximum number of messages (per event and level) that are forwarded to ERS (-1: disabled)"}

Definition at line 165 of file TrigMessageSvc.h.

165 {this, "ersPerEventLimit", -1,
166 "Maximum number of messages (per event and level) that are forwarded to ERS (-1: disabled)"};

◆ m_ersFormat

Gaudi::Property<std::string> TrigMessageSvc::m_ersFormat
private
Initial value:
{this, "ErsFormat", Message::getDefaultFormat(),
"ERS message format"}

Definition at line 110 of file TrigMessageSvc.h.

110 {this, "ErsFormat", Message::getDefaultFormat(),
111 "ERS message format"};

◆ m_eventIDLevel

Gaudi::Property<unsigned int> TrigMessageSvc::m_eventIDLevel
private
Initial value:
{this, "printEventIDLevel", MSG::NIL,
"Print event ID for this and higher message levels"}

Definition at line 119 of file TrigMessageSvc.h.

119 {this, "printEventIDLevel", MSG::NIL,
120 "Print event ID for this and higher message levels"};

◆ m_messageActionsQueue

tbb::concurrent_bounded_queue<std::function<void()> > TrigMessageSvc::m_messageActionsQueue
private

Definition at line 198 of file TrigMessageSvc.h.

◆ m_msgCount

std::array<int, MSG::NUM_LEVELS> TrigMessageSvc::m_msgCount {}
private

counts per level

Definition at line 183 of file TrigMessageSvc.h.

183{};

◆ m_msgCountHist

TH1I* TrigMessageSvc::m_msgCountHist {nullptr}
private

Message counting per level histogram.

Definition at line 191 of file TrigMessageSvc.h.

191{nullptr};

◆ m_msgCountSrcHist

TH2I* TrigMessageSvc::m_msgCountSrcHist {nullptr}
private

Message counting per message source.

Definition at line 192 of file TrigMessageSvc.h.

192{nullptr};

◆ m_msgHashCount

std::map<size_t, unsigned int> TrigMessageSvc::m_msgHashCount
private

counts per message hash

Definition at line 184 of file TrigMessageSvc.h.

◆ m_msgLimit

std::array<Gaudi::Property<int>, MSG::NUM_LEVELS> TrigMessageSvc::m_msgLimit
private
Initial value:
{{{this, "defaultLimit", 500},
{this, "verboseLimit", 500},
{this, "debugLimit", 500},
{this, "infoLimit", 500},
{this, "warningLimit", 500},
{this, "errorLimit", 500},
{this, "fatalLimit", 500},
{this, "alwaysLimit", 0}}}

Definition at line 137 of file TrigMessageSvc.h.

137 {{{this, "defaultLimit", 500},
138 {this, "verboseLimit", 500},
139 {this, "debugLimit", 500},
140 {this, "infoLimit", 500},
141 {this, "warningLimit", 500},
142 {this, "errorLimit", 500},
143 {this, "fatalLimit", 500},
144 {this, "alwaysLimit", 0}}};

◆ m_publishLevel

Gaudi::Property<unsigned int> TrigMessageSvc::m_publishLevel
private
Initial value:
{this, "publishLevel", MSG::INFO,
"Publish message statistics for this and higher message levels"}

Definition at line 117 of file TrigMessageSvc.h.

117 {this, "publishLevel", MSG::INFO,
118 "Publish message statistics for this and higher message levels"};

◆ m_slotMsgCount

std::unordered_map<EventContext::ContextID_t, std::pair<EventContext::ContextEvt_t, MsgAry> > TrigMessageSvc::m_slotMsgCount
private

counts per slot and level

Definition at line 186 of file TrigMessageSvc.h.

◆ m_sourceMap

std::map<std::string, MsgAry> TrigMessageSvc::m_sourceMap
private

counts per source

Definition at line 182 of file TrigMessageSvc.h.

◆ m_statLevel

Gaudi::Property<unsigned int> TrigMessageSvc::m_statLevel
private
Initial value:
{this, "statLevel", 0,
"Show total message statistics for >= level"}

Definition at line 115 of file TrigMessageSvc.h.

115 {this, "statLevel", 0,
116 "Show total message statistics for >= level"};

◆ m_stats

Gaudi::Property<bool> TrigMessageSvc::m_stats {this, "showStats", false, "Show message statistics"}
private

Definition at line 114 of file TrigMessageSvc.h.

114{this, "showStats", false, "Show message statistics"};

◆ m_suppress

Gaudi::Property<bool> TrigMessageSvc::m_suppress {this, "enableSuppression", false, "Enable message suppression"}
private

Definition at line 123 of file TrigMessageSvc.h.

123{this, "enableSuppression", false, "Enable message suppression"};

◆ m_suppressRunningOnly

Gaudi::Property<bool> TrigMessageSvc::m_suppressRunningOnly
private
Initial value:
{this, "suppressRunningOnly", true,
"Use message suppression only during RUNNING state"}

Definition at line 124 of file TrigMessageSvc.h.

124 {this, "suppressRunningOnly", true,
125 "Use message suppression only during RUNNING state"};

◆ m_thread

std::thread TrigMessageSvc::m_thread
private

Thread for asynchronous reporting.

Definition at line 197 of file TrigMessageSvc.h.

◆ m_thresholdMap

ThresholdMap TrigMessageSvc::m_thresholdMap
private

Output level threshold map.

Definition at line 172 of file TrigMessageSvc.h.

◆ m_thresholdMapMutex

std::recursive_mutex TrigMessageSvc::m_thresholdMapMutex
mutableprivate

Definition at line 194 of file TrigMessageSvc.h.

◆ m_thresholdProp

std::array<Gaudi::Property<std::vector<std::string> >, MSG::NUM_LEVELS> TrigMessageSvc::m_thresholdProp
private
Initial value:
{
{{},
{this, "setVerbose"},
{this, "setDebug"},
{this, "setInfo"},
{this, "setWarning"},
{this, "setError"},
{this, "setFatal"},
{this, "setAlways"}}}

Definition at line 127 of file TrigMessageSvc.h.

127 {
128 {{/*ignored*/},
129 {this, "setVerbose"},
130 {this, "setDebug"},
131 {this, "setInfo"},
132 {this, "setWarning"},
133 {this, "setError"},
134 {this, "setFatal"},
135 {this, "setAlways"}}};

◆ m_useERS

std::array<Gaudi::Property<std::vector<std::string> >, MSG::NUM_LEVELS> TrigMessageSvc::m_useERS
private
Initial value:
{
{{},
{this, "useErsVerbose", {}},
{this, "useErsDebug", {}},
{this, "useErsInfo", {}},
{this, "useErsWarning", {}},
{this, "useErsError", {}},
{this, "useErsFatal", {}},
{this, "useErsAlways", {}}}}

Special properties to control output to ERS of individual sources.

The syntax is as follows (these are NOT regular expressions):

useErsFatal = [] # forward none (default) useErsFatal = [''] # forward all useErsFatal = ['CoreDumpSvc','MyAlg'] # forward these sources useErsFatal = ['','!MyAlg'] # forward all except MyAlg

Definition at line 155 of file TrigMessageSvc.h.

155 {
156 {{/*ignored*/},
157 {this, "useErsVerbose", {}},
158 {this, "useErsDebug", {}},
159 {this, "useErsInfo", {}},
160 {this, "useErsWarning", {}},
161 {this, "useErsError", {}},
162 {this, "useErsFatal", {}},
163 {this, "useErsAlways", {}}}};

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