diff options
Diffstat (limited to 'logd/src/logd/legacy_forwarder.cpp')
-rw-r--r-- | logd/src/logd/legacy_forwarder.cpp | 121 |
1 files changed, 18 insertions, 103 deletions
diff --git a/logd/src/logd/legacy_forwarder.cpp b/logd/src/logd/legacy_forwarder.cpp index b512bab7fb6..b8b93a03530 100644 --- a/logd/src/logd/legacy_forwarder.cpp +++ b/logd/src/logd/legacy_forwarder.cpp @@ -3,6 +3,8 @@ #include "exceptions.h" #include "legacy_forwarder.h" #include "metrics.h" +#include <vespa/log/log_message.h> +#include <vespa/log/exceptions.h> #include <vespa/vespalib/component/vtag.h> #include <vespa/vespalib/locale/c.h> #include <unistd.h> @@ -11,6 +13,10 @@ LOG_SETUP(""); using LogLevel = ns_log::Logger::LogLevel; +using ns_log::BadLogLineException; +using ns_log::LogMessage; +using ns_log::Logger; +using LogLevel = Logger::LogLevel; namespace logdemon { @@ -18,7 +24,6 @@ LegacyForwarder::LegacyForwarder(Metrics &metrics) : _logserverfd(-1), _metrics(metrics), _forwardMap(), - _levelparser(), _badLines(0) {} LegacyForwarder::~LegacyForwarder() = default; @@ -70,120 +75,30 @@ LegacyForwarder::forwardLine(const char *line, const char *eol) bool LegacyForwarder::parseline(const char *linestart, const char *lineend) { - int llength = lineend - linestart; - - const char *fieldstart = linestart; - // time - const char *tab = strchr(fieldstart, '\t'); - if (tab == nullptr || tab == fieldstart) { - LOG(spam, "bad logline no 1. tab: %.*s", llength, linestart); - ++_badLines; - return false; - } - char *eod; - double logtime = vespalib::locale::c::strtod(fieldstart, &eod); - if (eod != tab) { - int fflen = tab - linestart; - LOG(spam, "bad logline first field not strtod parsable: %.*s", fflen, linestart); - ++_badLines; - return false; - } - time_t now = time(nullptr); - if (logtime - 864000 > now) { - int fflen = tab - linestart; - LOG(warning, "bad logline, time %.*s > 10 days in the future", fflen, linestart); - ++_badLines; - return false; - } - if (logtime + 8640000 < now) { - int fflen = tab - linestart; - LOG(warning, "bad logline, time %.*s > 100 days in the past", fflen, linestart); + LogMessage message; + try { + message.parse_log_line(std::string_view(linestart, lineend - linestart)); + } catch (BadLogLineException &e) { + LOG(spam, "bad logline: %s", e.what()); ++_badLines; return false; } - // hostname - fieldstart = tab + 1; - tab = strchr(fieldstart, '\t'); - if (tab == nullptr) { - LOG(spam, "bad logline no 2. tab: %.*s", llength, linestart); - ++_badLines; - return false; - } - - // pid - fieldstart = tab + 1; - tab = strchr(fieldstart, '\t'); - if (tab == nullptr || tab == fieldstart) { - LOG(spam, "bad logline no 3. tab: %.*s", llength, linestart); - return false; - } - - // service - fieldstart = tab + 1; - tab = strchr(fieldstart, '\t'); - if (tab == nullptr) { - LOG(spam, "bad logline no 4. tab: %.*s", llength, linestart); - ++_badLines; - return false; - } - if (tab == fieldstart) { - LOG(spam, "empty service in logline: %.*s", llength, linestart); - } - std::string service(fieldstart, tab-fieldstart); - - // component - fieldstart = tab + 1; - tab = strchr(fieldstart, '\t'); - if (tab == nullptr || tab == fieldstart) { - LOG(spam, "bad logline no 5. tab: %.*s", llength, linestart); - ++_badLines; - return false; - } - std::string component(fieldstart, tab-fieldstart); - - // level - fieldstart = tab + 1; - tab = strchr(fieldstart, '\t'); - if (tab == nullptr || tab == fieldstart) { - LOG(spam, "bad logline no 6. tab: %.*s", llength, linestart); - ++_badLines; - return false; - } - std::string level(fieldstart, tab-fieldstart); - LogLevel l = _levelparser.parseLevel(level.c_str()); - - // rest is freeform message, must be on this line: - if (tab > lineend) { - LOG(spam, "bad logline last tab after end: %.*s", llength, linestart); - ++_badLines; - return false; + std::string logLevelName; + if (message.level() >= LogLevel::NUM_LOGLEVELS) { + logLevelName = "unknown"; + } else { + logLevelName = Logger::logLevelNames[message.level()]; } - - _metrics.countLine(level, service); + _metrics.countLine(logLevelName, message.service()); // Check overrides - ForwardMap::iterator found = _forwardMap.find(l); + ForwardMap::iterator found = _forwardMap.find(message.level()); if (found != _forwardMap.end()) { return found->second; } return false; // Unknown log level } -LogLevel -LevelParser::parseLevel(const char *level) -{ - using ns_log::Logger; - - LogLevel l = Logger::parseLevel(level); - if (l >= 0 && l <= Logger::NUM_LOGLEVELS) { - return l; - } - if (_seenLevelMap.find(level) == _seenLevelMap.end()) { - LOG(warning, "unknown level '%s'", level); - _seenLevelMap.insert(level); - } - return Logger::fatal; -} } // namespace |