summaryrefslogtreecommitdiffstats
path: root/logd
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-03-26 14:12:15 +0100
committerTor Egge <Tor.Egge@broadpark.no>2019-03-26 14:12:15 +0100
commit8abc344fefdfcea75dbf9782fb7a815966d47c98 (patch)
treefe7c0f5d0971f2fc947c1381e54deaa548adfa52 /logd
parenta63447ca99a7d5f3a5b88a2cc2a939620b7749c2 (diff)
Use LogMessage from vespalog to parse log lines.
Diffstat (limited to 'logd')
-rw-r--r--logd/src/logd/legacy_forwarder.cpp121
-rw-r--r--logd/src/logd/legacy_forwarder.h11
2 files changed, 18 insertions, 114 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
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<std::string>;
// Mapping saying if a level should be forwarded or not
using ForwardMap = std::map<ns_log::Logger::LogLevel, bool>;
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;