summaryrefslogtreecommitdiffstats
path: root/vespalog
diff options
context:
space:
mode:
authorTor Egge <Tor.Egge@broadpark.no>2019-04-03 14:35:14 +0200
committerTor Egge <Tor.Egge@broadpark.no>2019-04-03 14:35:14 +0200
commit162d34589e06059c2cbfdfb6b23da7c0bab0f2f6 (patch)
treea0bfaa2a2f690fe5ed9fc6b3c13b0ebf9f6c65fd /vespalog
parentf9a907eafb17d9ae82c00da1db4e9a7b84d456fa (diff)
Avoid timestamp rounding errors.
Diffstat (limited to 'vespalog')
-rw-r--r--vespalog/src/vespa/log/log_message.cpp25
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