Skip to content

Commit fd0c035

Browse files
authored
Merge pull request #76 from sy-c/master
v2.4.0
2 parents 3d28557 + 15ce4a9 commit fd0c035

File tree

4 files changed

+62
-2
lines changed

4 files changed

+62
-2
lines changed

doc/releaseNotes.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,3 +108,6 @@ This file describes the main feature changes for each InfoLogger released versio
108108

109109
## v2.3.0 - 15/10/2021
110110
- Added possibility to use an AutoMuteToken in the c++ stream operator.
111+
112+
## v2.4.0 - 19/10/2021
113+
- Added getMessageCount() / resetMessageCount() to keep track of count of messages, by severity.

include/InfoLogger/InfoLogger.hxx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,13 @@ class InfoLogger
379379
/// Reset defined filters.
380380
/// All messages are then kept and handled normally.
381381
void filterReset();
382+
383+
/// Get current messages count for a given severity (use 'Undefined' for any)
384+
/// Messages are counted after filter, and before flood protection.
385+
unsigned long getMessageCount(InfoLogger::Severity severity);
386+
387+
/// Reset counters of messages
388+
void resetMessageCount();
382389

383390
///////////////////////
384391
/// internals

src/InfoLogger.cxx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,41 @@ class InfoLogger::Impl
452452
floodFile_msg_drop=0;
453453
}
454454

455+
// message statistics
456+
static const unsigned int numberOfSeverities = 5;
457+
std::atomic<unsigned long> messageCountPerSeverity[numberOfSeverities + 1] = {};
458+
459+
int getIndexFromSeverity(InfoLogger::Severity s) {
460+
switch(s) {
461+
case InfoLogger::Severity::Undefined: // undefined counted as 'info', as in defaultMsg
462+
case InfoLogger::Severity::Info:
463+
return 1;
464+
case InfoLogger::Severity::Error:
465+
return 2;
466+
case InfoLogger::Severity::Fatal:
467+
return 3;
468+
case InfoLogger::Severity::Warning:
469+
return 4;
470+
case InfoLogger::Severity::Debug:
471+
return 5;
472+
}
473+
return 0;
474+
}
475+
476+
unsigned long getMessageCount(InfoLogger::Severity severity) {
477+
// when severity "undefined", return the grand total
478+
if (severity == InfoLogger::Severity::Undefined) {
479+
return messageCountPerSeverity[0].load();
480+
}
481+
return messageCountPerSeverity[getIndexFromSeverity(severity)].load();
482+
}
483+
484+
void resetMessageCount() {
485+
for (int i=0; i<=numberOfSeverities; i++) {
486+
messageCountPerSeverity[i] = 0;
487+
}
488+
}
489+
455490
};
456491

457492
void InfoLogger::Impl::refreshDefaultMsg()
@@ -595,6 +630,11 @@ int InfoLogger::Impl::pushMessage(const InfoLoggerMessageOption& options, const
595630
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_username, String, context.userName.c_str());
596631
}
597632

633+
// message stats: after filter, before flood protection
634+
// NB: "Undefined" to be counted as "Info", as in defaultMsg. Translated correctly by getIndexFromSeverity.
635+
messageCountPerSeverity[0]++;
636+
messageCountPerSeverity[getIndexFromSeverity(options.severity)]++;
637+
598638
if (flood_protection) {
599639

600640
// update message statistics */
@@ -1188,6 +1228,14 @@ int InfoLogger::log(AutoMuteToken &limit, const char* message, ...) {
11881228
return err;
11891229
}
11901230

1231+
unsigned long InfoLogger::getMessageCount(InfoLogger::Severity severity) {
1232+
return mPimpl->getMessageCount(severity);
1233+
}
1234+
1235+
void InfoLogger::resetMessageCount() {
1236+
mPimpl->resetMessageCount();
1237+
}
1238+
11911239
// end of namespace
11921240
} // namespace InfoLogger
11931241
} // namespace AliceO2

test/testInfoLogger.cxx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ int main()
4141
theLog.log(InfoLogger::Severity::Fatal, "infoLogger FATAL message test");
4242
theLog.log(InfoLogger::Severity::Debug, "infoLogger DEBUG message test");
4343

44+
theLog.log(LogInfoDevel, "Number of messages logged so far: %lu I=%lu", theLog.getMessageCount(InfoLogger::Severity::Undefined), theLog.getMessageCount(InfoLogger::Severity::Info));
45+
4446
InfoLogger::InfoLoggerMessageOption options = InfoLogger::undefinedMessageOption;
4547
options.sourceLine = __LINE__;
4648
options.sourceFile = __FILE__;
@@ -50,10 +52,10 @@ int main()
5052

5153
// example use of context
5254
InfoLoggerContext ctxt({{InfoLoggerContext::FieldName::Facility, std::string("test1")}});
53-
theLog.log({{}},ctxt,"infoLogger message - facility test1");
55+
theLog.log({{InfoLogger::Severity::Info}},ctxt,"infoLogger message - facility test1");
5456

5557
// reuse a context and overwrite some fields
56-
theLog.log({{}},InfoLoggerContext(ctxt,{{InfoLoggerContext::FieldName::Facility, std::string("test2")}}),"infoLogger message - facility test2");
58+
theLog.log({{InfoLogger::Severity::Info}},InfoLoggerContext(ctxt,{{InfoLoggerContext::FieldName::Facility, std::string("test2")}}),"infoLogger message - facility test2");
5759

5860
// c++ style
5961
theLog << "another test message " << InfoLogger::endm;

0 commit comments

Comments
 (0)