From 8abc344fefdfcea75dbf9782fb7a815966d47c98 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Tue, 26 Mar 2019 14:12:15 +0100 Subject: Use LogMessage from vespalog to parse log lines. --- logd/src/logd/legacy_forwarder.cpp | 121 ++++++------------------------------- logd/src/logd/legacy_forwarder.h | 11 ---- 2 files changed, 18 insertions(+), 114 deletions(-) (limited to 'logd/src') 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 +#include #include #include #include @@ -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 diff --git a/logd/src/logd/legacy_forwarder.h b/logd/src/logd/legacy_forwarder.h index da8dbcc82ab..81a93ce1d50 100644 --- a/logd/src/logd/legacy_forwarder.h +++ b/logd/src/logd/legacy_forwarder.h @@ -8,21 +8,11 @@ namespace logdemon { -using SeenMap = std::unordered_set; // Mapping saying if a level should be forwarded or not using ForwardMap = std::map; struct Metrics; -class LevelParser -{ -private: - SeenMap _seenLevelMap; -public: - ns_log::Logger::LogLevel parseLevel(const char *level); - LevelParser() : _seenLevelMap() {} -}; - /** * Class used to forward log lines to the logserver via a one-way text protocol. */ @@ -31,7 +21,6 @@ private: int _logserverfd; Metrics &_metrics; ForwardMap _forwardMap; - LevelParser _levelparser; int _badLines; const char *copystr(const char *b, const char *e) { int len = e - b; -- cgit v1.2.3