@@ -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
550552int 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+
11621201void InfoLogger::filterReset () {
11631202 mPimpl ->filterDiscardDebug = false ;
11641203 mPimpl ->filterDiscardLevel = InfoLogger::undefinedMessageOption.level ;
0 commit comments