Skip to content

Commit 7c85ed1

Browse files
authored
Merge pull request #83 from sy-c/master
v2.5.0
2 parents 5284fef + b24b0df commit 7c85ed1

File tree

4 files changed

+64
-4
lines changed

4 files changed

+64
-4
lines changed

doc/releaseNotes.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# InfoLogger release notes
1+
rsion# InfoLogger release notes
22

33
This file describes the main feature changes for each InfoLogger released version.
44

@@ -123,3 +123,6 @@ This file describes the main feature changes for each InfoLogger released versio
123123

124124
## v2.4.4 - 09/05/2022
125125
- changed algorithm of DB threads message distribution, now based on timestamp to help keeping multi-line split messages in same order.
126+
127+
## v2.5.0 - 17/06/2022
128+
- added InfoLogger::filterDiscardSetFile(), to allow saving to local file the messages that would be discarded with filterDiscard(...) settings.

include/InfoLogger/InfoLogger.hxx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,14 @@ class InfoLogger
376376
/// Messages with undefined level are never filtered out.
377377
void filterDiscardLevel(int excludeLevel);
378378

379+
/// Defines a file where discarded messages are saved
380+
/// path: path to file. If null, discarding to file is disabled.
381+
/// rotateMaxBytes: Maximum file size, after which a new file is created. If zero, no limit.
382+
/// rotateMaxFiles: Maximum number of files to keep (including the "current" file). If zero, no limit.
383+
/// rotateNow: If non-zero, the file is immediately rotated (independently of its size), otherwise it is appended.
384+
/// Returns 0 on success, or an error code.
385+
int filterDiscardSetFile(const char *path, unsigned long rotateMaxBytes = 0, unsigned int rotateMaxFiles = 0, unsigned int rotateNow = 0);
386+
379387
/// Reset defined filters.
380388
/// All messages are then kept and handled normally.
381389
void filterReset();

src/InfoLogger.cxx

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,8 @@ class InfoLogger::Impl
417417

418418
bool filterDiscardDebug = false; // when set, messages with debug severity are dropped
419419
int filterDiscardLevel = InfoLogger::undefinedMessageOption.level; // when set, messages with higher level (>=) are dropped
420+
bool filterDiscardFileEnabled = false; // when set, discarded messages go to file
421+
SimpleLog filterDiscardFile; // file object where to save discarded messages
420422

421423
// message flood prevention
422424
// constants
@@ -549,14 +551,19 @@ int InfoLogger::Impl::pushMessage(InfoLogger::Severity severity, const char* mes
549551

550552
int InfoLogger::Impl::pushMessage(const InfoLoggerMessageOption& options, const InfoLoggerContext& context, const char* messageBody, bool noFlood)
551553
{
554+
bool discardMessage = 0;
555+
552556
// check if message passes local filter criteria, if any
553557
if (filterDiscardDebug && (options.severity == InfoLogger::Severity::Debug)) {
554-
return 1;
558+
discardMessage = 1;
555559
}
556560
if ((filterDiscardLevel != undefinedMessageOption.level)
557561
&& (options.level != undefinedMessageOption.level)
558562
&& (options.level >= filterDiscardLevel)) {
559-
return 1;
563+
discardMessage = 1;
564+
}
565+
if ((discardMessage) && (!filterDiscardFileEnabled)) {
566+
return 1;
560567
}
561568

562569
infoLog_msg_t msg = defaultMsg;
@@ -630,6 +637,28 @@ int InfoLogger::Impl::pushMessage(const InfoLoggerMessageOption& options, const
630637
InfoLoggerMessageHelperSetValue(msg, msgHelper.ix_username, String, context.userName.c_str());
631638
}
632639

640+
// handling of messages to be discarded to file
641+
if (discardMessage) {
642+
char buffer[LOG_MAX_SIZE];
643+
msgHelper.MessageToText(&msg, buffer, sizeof(buffer), InfoLoggerMessageHelper::Format::Simple);
644+
645+
switch (options.severity) {
646+
case (InfoLogger::Severity::Fatal):
647+
case (InfoLogger::Severity::Error):
648+
filterDiscardFile.error("%s", buffer);
649+
break;
650+
case (InfoLogger::Severity::Warning):
651+
filterDiscardFile.warning("%s", buffer);
652+
break;
653+
case (InfoLogger::Severity::Info):
654+
case (InfoLogger::Severity::Debug):
655+
default:
656+
filterDiscardFile.info("%s", buffer);
657+
break;
658+
}
659+
return 1;
660+
}
661+
633662
// message stats: after filter, before flood protection
634663
// NB: "Undefined" to be counted as "Info", as in defaultMsg. Translated correctly by getIndexFromSeverity.
635664
messageCountPerSeverity[0]++;
@@ -1159,6 +1188,16 @@ void InfoLogger::filterDiscardLevel(int excludeLevel) {
11591188
mPimpl->filterDiscardLevel = excludeLevel;
11601189
}
11611190

1191+
int InfoLogger::filterDiscardSetFile(const char *path, unsigned long rotateMaxBytes, unsigned int rotateMaxFiles, unsigned int rotateNow) {
1192+
mPimpl->filterDiscardFileEnabled = false;
1193+
int err = mPimpl->filterDiscardFile.setLogFile(path, rotateMaxBytes, rotateMaxFiles, rotateNow);
1194+
if (!err) {
1195+
mPimpl->filterDiscardFileEnabled = true;
1196+
//mPimpl->filterDiscardFile.setOutputFormat(SimpleLog::FormatOption::ShowMessage);
1197+
}
1198+
return err;
1199+
}
1200+
11621201
void InfoLogger::filterReset() {
11631202
mPimpl->filterDiscardDebug = false;
11641203
mPimpl->filterDiscardLevel = InfoLogger::undefinedMessageOption.level;

test/testInfoLogger.cxx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,17 @@ int main()
8383
theLog.log(LogInfoDevel, "Info message with severity filter - you should see this");
8484
theLog.filterReset();
8585
theLog.log(LogDebugDevel, "Debug message with severity filter - you should see this again");
86-
86+
87+
#define PATH_LOGS_DISCARDED "/tmp/logsdiscarded.txt"
88+
theLog.log(LogInfoDevel, "Discarding messages to file " PATH_LOGS_DISCARDED);
89+
theLog.filterDiscardLevel(InfoLogger::Level::Devel);
90+
theLog.filterDiscardDebug(1);
91+
theLog.filterDiscardSetFile(PATH_LOGS_DISCARDED);
92+
theLog.log(LogInfoDevel, "Devel message with level filter - you should see this only in file");
93+
theLog.log(LogDebugDevel, "Debug message with severity filter - you should see this only in file");
94+
theLog.log(LogErrorDevel, "Devel error message with level filter - you should see this only in file");
95+
theLog.filterReset();
96+
8797
// message verbosity control with auto-mute
8898
const int limitN = 5; // max number of messages ...
8999
const int limitT = 3; // ... for given time interval

0 commit comments

Comments
 (0)