diff options
author | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2019-03-29 15:55:36 +0100 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@verizonmedia.com> | 2019-03-29 15:57:12 +0100 |
commit | e67fe860e5cfe6b76c8df84c06d7a25483abfd93 (patch) | |
tree | 289b62c03d38a931035869d374754504fada4422 | |
parent | 2d40790982e4743e5f72a5556a4ef74426d8b140 (diff) |
Improve parsing of timestamps
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()); + } + } } |