From 162d34589e06059c2cbfdfb6b23da7c0bab0f2f6 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Wed, 3 Apr 2019 14:35:14 +0200 Subject: Avoid timestamp rounding errors. --- vespalog/src/vespa/log/log_message.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'vespalog') diff --git a/vespalog/src/vespa/log/log_message.cpp b/vespalog/src/vespa/log/log_message.cpp index 77f9b619e9f..8ce7df93a12 100644 --- a/vespalog/src/vespa/log/log_message.cpp +++ b/vespalog/src/vespa/log/log_message.cpp @@ -31,18 +31,29 @@ find_tab(std::string_view log_line, const char *tab_name, std::string_view::size } int64_t -parse_time_field(std::string time_field) +parse_time_subfield(std::string time_subfield, const std::string &time_field) { - std::istringstream time_stream(time_field); - time_stream.imbue(clocale); - double logtime = 0; - time_stream >> logtime; - if (!time_stream.eof()) { + std::istringstream subfield_stream(time_subfield); + subfield_stream.imbue(clocale); + int64_t result = 0; + subfield_stream >> result; + if (!subfield_stream.eof()) { std::ostringstream os; os << "Bad time field: " << time_field; throw BadLogLineException(os.str()); } - return logtime * 1000000000; + return result; +} + +int64_t +parse_time_field(std::string time_field) +{ + auto dotPos = time_field.find('.'); + int64_t log_time = parse_time_subfield(time_field.substr(0, dotPos), time_field) * 1000000000; + if (dotPos != std::string::npos) { + log_time += parse_time_subfield((time_field.substr(dotPos + 1) + "000000000").substr(0, 9), time_field); + } + return log_time; } struct PidFieldParser -- cgit v1.2.3