summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@verizonmedia.com>2019-03-29 15:55:36 +0100
committerBjørn Christian Seime <bjorncs@verizonmedia.com>2019-03-29 15:57:12 +0100
commite67fe860e5cfe6b76c8df84c06d7a25483abfd93 (patch)
tree289b62c03d38a931035869d374754504fada4422
parent2d40790982e4743e5f72a5556a4ef74426d8b140 (diff)
Improve parsing of timestamps
-rw-r--r--vespalog/abi-spec.json1
-rw-r--r--vespalog/src/main/java/com/yahoo/log/InvalidLogFormatException.java4
-rw-r--r--vespalog/src/main/java/com/yahoo/log/LogMessage.java11
-rw-r--r--vespalog/src/test/java/com/yahoo/log/LogMessageTestCase.java17
4 files changed, 30 insertions, 3 deletions
diff --git a/vespalog/abi-spec.json b/vespalog/abi-spec.json
index 10a7a83c835..edf9703af4b 100644
--- a/vespalog/abi-spec.json
+++ b/vespalog/abi-spec.json
@@ -23,6 +23,7 @@
],
"methods": [
"public void <init>(java.lang.String)",
+ "public void <init>(java.lang.String, java.lang.Throwable)",
"public void <init>()"
],
"fields": []
diff --git a/vespalog/src/main/java/com/yahoo/log/InvalidLogFormatException.java b/vespalog/src/main/java/com/yahoo/log/InvalidLogFormatException.java
index 37d43b37952..49e0ced7a57 100644
--- a/vespalog/src/main/java/com/yahoo/log/InvalidLogFormatException.java
+++ b/vespalog/src/main/java/com/yahoo/log/InvalidLogFormatException.java
@@ -13,6 +13,10 @@ public class InvalidLogFormatException extends Exception
super(msg);
}
+ public InvalidLogFormatException (String msg, Throwable cause) {
+ super(msg, cause);
+ }
+
public InvalidLogFormatException () {
}
}
diff --git a/vespalog/src/main/java/com/yahoo/log/LogMessage.java b/vespalog/src/main/java/com/yahoo/log/LogMessage.java
index ac5b4fcfa0e..1736352493e 100644
--- a/vespalog/src/main/java/com/yahoo/log/LogMessage.java
+++ b/vespalog/src/main/java/com/yahoo/log/LogMessage.java
@@ -120,10 +120,15 @@ public class LogMessage
private static Instant parseTimestamp(String timeStr) throws InvalidLogFormatException {
try {
- long nanoseconds = (long) (Double.parseDouble(timeStr) * 1_000_000_000L);
- return Instant.ofEpochSecond(0, nanoseconds);
+ int decimalSeparator = timeStr.indexOf('.');
+ if (decimalSeparator == -1) {
+ return Instant.ofEpochSecond(Long.parseLong(timeStr));
+ }
+ long seconds = Long.parseLong(timeStr.substring(0, decimalSeparator));
+ long nanoseconds = Long.parseLong(String.format("%1$-9s", timeStr.substring(decimalSeparator + 1)).replace(' ', '0')); // right pad with zeros
+ return Instant.ofEpochSecond(seconds, nanoseconds);
} catch (NumberFormatException e) {
- throw new InvalidLogFormatException("Invalid time string: " + timeStr);
+ throw new InvalidLogFormatException(String.format("Failed to parse timestamp: %s. Timestamp string: '%s'", e.getMessage(), timeStr), e);
}
}
diff --git a/vespalog/src/test/java/com/yahoo/log/LogMessageTestCase.java b/vespalog/src/test/java/com/yahoo/log/LogMessageTestCase.java
index 5c6474314fc..15618329ba3 100644
--- a/vespalog/src/test/java/com/yahoo/log/LogMessageTestCase.java
+++ b/vespalog/src/test/java/com/yahoo/log/LogMessageTestCase.java
@@ -9,6 +9,7 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
/**
@@ -46,5 +47,21 @@ public class LogMessageTestCase {
}
}
+
+ @Test
+ public void testParsingTimestampAndRendering() throws InvalidLogFormatException {
+ {
+ LogMessage message = LogMessage.parseNativeFormat("1096639280.524133935\tmalfunction\t26851\t-\tlogtest\tinfo\tStarting up, called as ./log/logtest");
+ assertEquals(1096639280L, message.getTimestamp().getEpochSecond());
+ assertEquals(524133935L, message.getTimestamp().getNano());
+ assertEquals("1096639280.524133\tmalfunction\t26851\t-\tlogtest\tinfo\tStarting up, called as ./log/logtest\n", message.toString());
+ }
+ {
+ LogMessage message = LogMessage.parseNativeFormat("1096639280.524\tmalfunction\t26851\t-\tlogtest\tinfo\tbackslash: \\\\");
+ assertEquals(1096639280L, message.getTimestamp().getEpochSecond());
+ assertEquals(524_000_000L, message.getTimestamp().getNano());
+ assertEquals("1096639280.524000\tmalfunction\t26851\t-\tlogtest\tinfo\tbackslash: \\\\\n", message.toString());
+ }
+ }
}