Skip to content

Commit d4ebc69

Browse files
Merge pull request #78 from SAP/written_ts-nano
Add support for nanoseconds in written_ts
2 parents 0d03cd0 + e44d334 commit d4ebc69

File tree

5 files changed

+44
-15
lines changed

5 files changed

+44
-15
lines changed

cf-java-logging-support-log4j2/src/main/java/com/sap/hcp/cf/log4j2/converter/TimestampConverter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
package com.sap.hcp.cf.log4j2.converter;
22

3+
import java.time.Instant;
4+
35
import org.apache.logging.log4j.core.LogEvent;
46
import org.apache.logging.log4j.core.config.plugins.Plugin;
57
import org.apache.logging.log4j.core.pattern.ConverterKeys;
68
import org.apache.logging.log4j.core.pattern.LogEventPatternConverter;
79

810
@Plugin(name = "TimestampConverter", category = "Converter")
911
@ConverterKeys({ "tstamp" })
12+
/**
13+
* This is a simple {@link LogEventPatternConverter} implementation that prints
14+
* the timestamp as a long in nano second resolution. Note: nano second
15+
* precision is only available from Java 9 or newer. Java 8 will only have milli
16+
* seconds.
17+
*/
1018
public class TimestampConverter extends LogEventPatternConverter {
1119

1220
public static final String WORD = "tstamp";
@@ -21,7 +29,9 @@ public static TimestampConverter newInstance(final String[] options) {
2129

2230
@Override
2331
public void format(LogEvent event, StringBuilder toAppendTo) {
24-
toAppendTo.append(System.currentTimeMillis() * 1000000);
32+
Instant now = Instant.now();
33+
long timestamp = now.getEpochSecond() * 1_000_000_000L + now.getNano();
34+
toAppendTo.append(timestamp);
2535
}
2636

2737
}

cf-java-logging-support-log4j2/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.sap.hcp.cf.logging.common;
22

33
import static com.sap.hcp.cf.logging.common.converter.CustomFieldMatchers.hasCustomField;
4+
import static org.hamcrest.MatcherAssert.assertThat;
45
import static org.hamcrest.Matchers.contains;
56
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
67
import static org.hamcrest.Matchers.lessThanOrEqualTo;
78
import static org.hamcrest.core.Is.is;
89
import static org.hamcrest.core.IsNull.notNullValue;
9-
import static org.junit.Assert.assertThat;
10+
11+
import java.time.Instant;
1012

1113
import org.junit.Test;
1214
import org.slf4j.Logger;
@@ -63,9 +65,9 @@ public void testMDC() {
6365
MDC.put(SOME_KEY, SOME_VALUE);
6466
MDC.put("testNumeric", "200");
6567
logMsg = "Running testMDC()";
66-
long beforeTS = System.currentTimeMillis() * 1000000;
68+
long beforeTS = now();
6769
LOGGER.info(logMsg);
68-
long afterTS = System.currentTimeMillis() * 1000000;
70+
long afterTS = now();
6971
assertThat(getMessage(), is(logMsg));
7072
assertThat(getField(Fields.COMPONENT_ID), is("-"));
7173
assertThat(getField(Fields.COMPONENT_NAME), is("-"));
@@ -78,7 +80,7 @@ public void testMDC() {
7880
@Test
7981
public void testUnregisteredCustomField() {
8082
logMsg = "Running testUnregisteredCustomField()";
81-
long beforeTS = System.currentTimeMillis() * 1000000;
83+
long beforeTS = now();
8284
LOGGER.info(logMsg, CustomField.customField(SOME_KEY, SOME_VALUE));
8385
assertThat(getMessage(), is(logMsg));
8486
assertThat(getField(SOME_KEY), is(SOME_VALUE));
@@ -96,7 +98,7 @@ public void testCustomFieldOverwritesMdc() throws Exception {
9698
MDC.put(RETAINED_FIELD_KEY, SOME_VALUE);
9799
MDC.put(SOME_KEY, SOME_VALUE);
98100
logMsg = "Running testCustomFieldOverwritesMdc()";
99-
long beforeTS = System.currentTimeMillis() * 1000000;
101+
long beforeTS = now();
100102
LOGGER.info(logMsg, CustomField.customField(CUSTOM_FIELD_KEY, SOME_OTHER_VALUE),
101103
CustomField.customField(RETAINED_FIELD_KEY, SOME_OTHER_VALUE),
102104
CustomField.customField(SOME_KEY, SOME_OTHER_VALUE));
@@ -137,4 +139,9 @@ public void testJSONMsg() {
137139
LOGGER.info(jsonMsg);
138140
assertThat(getMessage(), is(jsonMsg));
139141
}
142+
143+
private static long now() {
144+
Instant now = Instant.now();
145+
return now.getEpochSecond() * 1_000_000_000L + now.getNano();
146+
}
140147
}

cf-java-logging-support-logback/src/main/java/com/sap/hcp/cf/logback/converter/TimestampConverter.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.sap.hcp.cf.logback.converter;
22

3+
import java.time.Instant;
4+
35
import ch.qos.logback.classic.pattern.ClassicConverter;
46
import ch.qos.logback.classic.spi.ILoggingEvent;
57

68
/**
7-
* This is a simple {@link ClassicConverter} implementation that print the
8-
* timestamp as a long in nano second resolution.
9+
* This is a simple {@link ClassicConverter} implementation that prints the
10+
* timestamp as a long in nano second resolution. Note: nano second precision is
11+
* only available from Java 9 or newer. Java 8 will only have milli seconds.
912
*/
1013
public class TimestampConverter extends ClassicConverter {
1114

@@ -14,7 +17,9 @@ public class TimestampConverter extends ClassicConverter {
1417
@Override
1518
public String convert(ILoggingEvent event) {
1619
StringBuilder appendTo = new StringBuilder();
17-
appendTo.append(System.currentTimeMillis() * 1000000);
20+
Instant now = Instant.now();
21+
long timestamp = now.getEpochSecond() * 1_000_000_000L + now.getNano();
22+
appendTo.append(timestamp);
1823
return appendTo.toString();
1924
}
2025

cf-java-logging-support-logback/src/test/java/com/sap/hcp/cf/logging/common/TestAppLog.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.sap.hcp.cf.logging.common;
22

33
import static com.sap.hcp.cf.logging.common.converter.CustomFieldMatchers.hasCustomField;
4+
import static org.hamcrest.MatcherAssert.assertThat;
45
import static org.hamcrest.Matchers.contains;
56
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
67
import static org.hamcrest.Matchers.lessThanOrEqualTo;
78
import static org.hamcrest.core.Is.is;
89
import static org.hamcrest.core.IsNull.notNullValue;
9-
import static org.junit.Assert.assertThat;
10+
11+
import java.time.Instant;
1012

1113
import org.junit.Test;
1214
import org.slf4j.Logger;
@@ -64,7 +66,7 @@ public void testMDC() {
6466
MDC.put(SOME_KEY, SOME_VALUE);
6567
MDC.put("testNumeric", "200");
6668
logMsg = "Running testMDC()";
67-
long beforeTS = System.currentTimeMillis() * 1000000;
69+
long beforeTS = now();
6870
LOGGER.info(logMsg);
6971
assertThat(getMessage(), is(logMsg));
7072
assertThat(getField(Fields.COMPONENT_ID), is("-"));
@@ -80,7 +82,7 @@ public void testMDC() {
8082
@Test
8183
public void testUnregisteredCustomField() {
8284
logMsg = "Running testUnregisteredCustomField()";
83-
long beforeTS = System.currentTimeMillis() * 1000000;
85+
long beforeTS = now();
8486
LOGGER.info(logMsg, CustomField.customField(SOME_KEY, SOME_VALUE));
8587
assertThat(getMessage(), is(logMsg));
8688
assertThat(getField(SOME_KEY), is(SOME_VALUE));
@@ -98,7 +100,7 @@ public void testCustomFieldOverwritesMdc() throws Exception {
98100
MDC.put(RETAINED_FIELD_KEY, SOME_VALUE);
99101
MDC.put(SOME_KEY, SOME_VALUE);
100102
logMsg = "Running testCustomFieldOverwritesMdc()";
101-
long beforeTS = System.currentTimeMillis() * 1000000;
103+
long beforeTS = now();
102104
LOGGER.info(logMsg, CustomField.customField(CUSTOM_FIELD_KEY, SOME_OTHER_VALUE),
103105
CustomField.customField(RETAINED_FIELD_KEY, SOME_OTHER_VALUE),
104106
CustomField.customField(SOME_KEY, SOME_OTHER_VALUE));
@@ -139,4 +141,9 @@ public void testJSONMsg() {
139141
LOGGER.info(jsonMsg);
140142
assertThat(getMessage(), is(jsonMsg));
141143
}
144+
145+
private static long now() {
146+
Instant now = Instant.now();
147+
return now.getEpochSecond() * 1_000_000_000L + now.getNano();
148+
}
142149
}

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
<junit.version>4.13.1</junit.version>
178178
<mockito.version>1.9.5</mockito.version>
179179
<surefire.plugin.version>2.18.1</surefire.plugin.version>
180-
<animal.sniffer.version>1.18</animal.sniffer.version>
180+
<animal.sniffer.version>1.19</animal.sniffer.version>
181181
<exec.plugin.version>1.4.0</exec.plugin.version>
182182
<javadoc.plugin.version>3.1.1</javadoc.plugin.version>
183183
<gpg.plugin.version>1.6</gpg.plugin.version>
@@ -268,7 +268,7 @@
268268
<configuration>
269269
<signature>
270270
<groupId>org.codehaus.mojo.signature</groupId>
271-
<artifactId>java16</artifactId>
271+
<artifactId>java18</artifactId>
272272
<version>1.0</version>
273273
</signature>
274274
</configuration>

0 commit comments

Comments
 (0)