diff options
author | Geir Storli <geirst@verizonmedia.com> | 2019-04-04 08:25:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-04 08:25:01 +0200 |
commit | c8c842d622eb744504fe0b7b15044602b85ec0ee (patch) | |
tree | e9dbd67083ca292e6212293d0b91e7b76faefd26 /vespalog | |
parent | f513e87c06b9cb136411b1bfcc182cf1e0aae706 (diff) | |
parent | dac529d0484c34424d3930e1b2ac4737ae98812f (diff) |
Merge pull request #8996 from vespa-engine/toregge/avoid-log-timestamp-rounding-errors
Avoid log timestamp rounding errors
Diffstat (limited to 'vespalog')
-rw-r--r-- | vespalog/src/vespa/log/log_message.cpp | 25 |
1 files changed, 18 insertions, 7 deletions
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 |