1
14 package net.logstash.logback.composite;
15
16 import java.io.IOException;
17 import java.util.TimeZone;
18
19 import net.logstash.logback.fieldnames.LogstashCommonFieldNames;
20
21 import org.apache.commons.lang3.time.FastDateFormat;
22
23 import ch.qos.logback.core.spi.DeferredProcessingAware;
24
25 import com.fasterxml.jackson.core.JsonGenerator;
26
27
35 public abstract class FormattedTimestampJsonProvider<Event extends DeferredProcessingAware, FieldNames extends LogstashCommonFieldNames> extends AbstractFieldJsonProvider<Event> implements FieldNamesAware<FieldNames> {
36
37 public static final String FIELD_TIMESTAMP = "@timestamp";
38
39
43 public static final String UNIX_TIMESTAMP_AS_NUMBER = "[UNIX_TIMESTAMP_AS_NUMBER]";
44
45
49 public static final String UNIX_TIMESTAMP_AS_STRING = "[UNIX_TIMESTAMP_AS_STRING]";
50
51 private static final String DEFAULT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
52 private static final TimeZone DEFAULT_TIMEZONE = null;
53
54
60 private String pattern = DEFAULT_PATTERN;
61
62
66 private TimeZone timeZone = DEFAULT_TIMEZONE;
67
68
71 private TimestampWriter timestampWriter = new PatternTimestampWriter(FastDateFormat.getInstance(pattern, timeZone));
72
73
76 private static interface TimestampWriter {
77 void writeTo(JsonGenerator generator, String fieldName, long timestampInMillis) throws IOException;
78
79 String getTimestampAsString(long timestampInMillis);
80 }
81
82
85 private static class PatternTimestampWriter implements TimestampWriter {
86
87 private final FastDateFormat formatter;
88
89 public PatternTimestampWriter(FastDateFormat formatter) {
90 this.formatter = formatter;
91 }
92
93
94 @Override
95 public void writeTo(JsonGenerator generator, String fieldName, long timestampInMillis) throws IOException {
96 JsonWritingUtils.writeStringField(generator, fieldName, getTimestampAsString(timestampInMillis));
97 }
98
99 @Override
100 public String getTimestampAsString(long timestampInMillis) {
101 return formatter.format(timestampInMillis);
102 }
103 }
104
105
108 private static class NumberTimestampWriter implements TimestampWriter {
109
110 @Override
111 public void writeTo(JsonGenerator generator, String fieldName, long timestampInMillis) throws IOException {
112 JsonWritingUtils.writeNumberField(generator, fieldName, timestampInMillis);
113 }
114
115 @Override
116 public String getTimestampAsString(long timestampInMillis) {
117 return Long.toString(timestampInMillis);
118 }
119 }
120
121
124 private static class StringTimestampWriter implements TimestampWriter {
125
126 @Override
127 public void writeTo(JsonGenerator generator, String fieldName, long timestampInMillis) throws IOException {
128 JsonWritingUtils.writeStringField(generator, fieldName, getTimestampAsString(timestampInMillis));
129 }
130
131 @Override
132 public String getTimestampAsString(long timestampInMillis) {
133 return Long.toString(timestampInMillis);
134 }
135
136 }
137
138 public FormattedTimestampJsonProvider() {
139 setFieldName(FIELD_TIMESTAMP);
140 }
141
142 @Override
143 public void setFieldNames(FieldNames fieldNames) {
144 setFieldName(fieldNames.getTimestamp());
145 }
146
147 @Override
148 public void writeTo(JsonGenerator generator, Event event) throws IOException {
149 timestampWriter.writeTo(generator, getFieldName(), getTimestampAsMillis(event));
150 }
151
152 protected String getFormattedTimestamp(Event event) {
153 return timestampWriter.getTimestampAsString(getTimestampAsMillis(event));
154 }
155
156 protected abstract long getTimestampAsMillis(Event event);
157
158
161 private void updateTimestampWriter() {
162 if (UNIX_TIMESTAMP_AS_NUMBER.equals(pattern)) {
163 timestampWriter = new NumberTimestampWriter();
164 } else if (UNIX_TIMESTAMP_AS_STRING.equals(pattern)) {
165 timestampWriter = new StringTimestampWriter();
166 } else {
167 timestampWriter = new PatternTimestampWriter(FastDateFormat.getInstance(pattern, timeZone));
168 }
169 }
170
171 public String getPattern() {
172 return pattern;
173 }
174 public void setPattern(String pattern) {
175 this.pattern = pattern;
176 updateTimestampWriter();
177 }
178 public String getTimeZone() {
179 return timeZone.getID();
180 }
181 public void setTimeZone(String timeZoneId) {
182 this.timeZone = TimeZone.getTimeZone(timeZoneId);
183 updateTimestampWriter();
184 }
185 }
186