Skip to content

Commit e195e59

Browse files
authored
Merge pull request #48 from sy-c/master
local message filter
2 parents a800b86 + d19f5a7 commit e195e59

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

doc/releaseNotes.md

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

5151
## v1.3.13 - 03/09/2020
5252
- added unsetFMQLogsToInfoLogger() function, to be called before destroying infoLogger handles used for FMQ redirection.
53+
54+
## next version
55+
- added functions to discard locally (in client) messages with debug severity or high level. See filterDiscardDebug(), filterDiscardLevel() and filterReset().

include/InfoLogger/InfoLogger.hxx

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,26 @@ class InfoLogger
295295
return *this;
296296
}
297297

298+
299+
/// Functions to define a local log filtering policy, to discard immediately any log message
300+
/// matching criteria.
301+
/// This allows an application to self-configure its verbosity.
302+
/// Messages are dropped immediately in the process, they do not reach infoLoggerD.
303+
304+
/// Select discarding of messages with DEBUG severity.
305+
/// parameter: 0 (default, debug messages kept) or 1 (debug messages discarded)
306+
void filterDiscardDebug(bool enable);
307+
308+
/// Select discarding of messages with higher levels.
309+
/// parameter: level from which messages are discarded (bigger than or equal to this level).
310+
/// Can be InfoLogger::undefinedMessageOption.level, to keep messages of all levels (default)
311+
/// Messages with undefined level are never filtered out.
312+
void filterDiscardLevel(int excludeLevel);
313+
314+
/// Reset defined filters.
315+
/// All messages are then kept and handled normally.
316+
void filterReset();
317+
298318
///////////////////////
299319
/// internals
300320
///////////////////////

src/InfoLogger.cxx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,9 @@ class InfoLogger::Impl
290290
int pipeStderr[2]; // a pipe to redirect stderr to collecting thread
291291
std::unique_ptr<std::thread> redirectThread; // the thread handling the redirection
292292
bool redirectThreadShutdown; // flag to ask the thread to stop
293+
294+
bool filterDiscardDebug = false; // when set, messages with debug severity are dropped
295+
int filterDiscardLevel = InfoLogger::undefinedMessageOption.level; // when set, messages with higher level (>=) are dropped
293296
};
294297

295298
void InfoLogger::Impl::refreshDefaultMsg()
@@ -352,6 +355,16 @@ int InfoLogger::Impl::pushMessage(InfoLogger::Severity severity, const char* mes
352355

353356
int InfoLogger::Impl::pushMessage(const InfoLoggerMessageOption& options, const InfoLoggerContext& context, const char* messageBody)
354357
{
358+
// check if message passes local filter criteria, if any
359+
if (filterDiscardDebug && (options.severity == InfoLogger::Severity::Debug)) {
360+
return 1;
361+
}
362+
if ((filterDiscardLevel != undefinedMessageOption.level)
363+
&& (options.level != undefinedMessageOption.level)
364+
&& (options.level >= filterDiscardLevel)) {
365+
return 1;
366+
}
367+
355368
infoLog_msg_t msg = defaultMsg;
356369

357370
struct timeval tv;
@@ -839,6 +852,21 @@ int InfoLogger::setStandardRedirection(bool state)
839852
return 0;
840853
}
841854

855+
void InfoLogger::filterDiscardDebug(bool enable) {
856+
mPimpl->filterDiscardDebug=enable;
857+
}
858+
859+
void InfoLogger::filterDiscardLevel(int excludeLevel) {
860+
mPimpl->filterDiscardLevel = excludeLevel;
861+
}
862+
863+
void InfoLogger::filterReset() {
864+
mPimpl->filterDiscardDebug = false;
865+
mPimpl->filterDiscardLevel = InfoLogger::undefinedMessageOption.level;
866+
}
867+
868+
869+
842870
// end of namespace
843871
} // namespace InfoLogger
844872
} // namespace AliceO2

test/testInfoLogger.cxx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,5 +58,19 @@ int main()
5858

5959
theLog.log(LogInfoDevel, "Test message with InfoLoggerMessageOption macro");
6060
theLog << LogInfoOps << "Test message with InfoLoggerMessageOption macro" << InfoLogger::endm;
61+
62+
63+
// local filtering of messages
64+
theLog.log(LogInfoDevel, "Devel message without filter");
65+
theLog.filterDiscardLevel(InfoLogger::Level::Devel);
66+
theLog.log(LogInfoDevel, "Devel message with level filter - you should not see this");
67+
theLog.filterReset();
68+
theLog.log(LogInfoDevel, "Devel message with level filter reset - you should see this again");
69+
theLog.log(LogDebugDevel, "Debug message without filter");
70+
theLog.filterDiscardDebug(1);
71+
theLog.log(LogDebugDevel, "Debug message with severity filter - you should not see this");
72+
theLog.log(LogInfoDevel, "Info message with severity filter - you should see this");
73+
theLog.filterReset();
74+
theLog.log(LogDebugDevel, "Debug message with severity filter - you should see this again");
6175
return 0;
6276
}

0 commit comments

Comments
 (0)