Skip to content

Commit b1d0c2c

Browse files
authored
Merge pull request #59 from avaje/feature/defaults-component-env
Add component and dev fields, Align field names, default to conservative package name trimming
2 parents 1028ecb + 6c73b69 commit b1d0c2c

File tree

8 files changed

+119
-36
lines changed

8 files changed

+119
-36
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@
1111

1212
<groupId>io.avaje</groupId>
1313
<artifactId>avaje-logback-encoder</artifactId>
14-
<version>0.7</version>
14+
<version>0.8-RC1</version>
1515

1616
<properties>
1717
<surefire.useModulePath>false</surefire.useModulePath>
18-
<project.build.outputTimestamp>2025-01-08T11:36:03Z</project.build.outputTimestamp>
18+
<project.build.outputTimestamp>2025-01-08T21:18:50Z</project.build.outputTimestamp>
1919
</properties>
2020

2121
<dependencies>

src/main/java/io/avaje/logback/encoder/JsonEncoder.java

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,34 +13,26 @@
1313
import io.avaje.json.PropertyNames;
1414
import io.avaje.json.simple.SimpleMapper;
1515
import io.avaje.json.stream.JsonStream;
16-
import io.avaje.logback.encoder.abbreviator.TrimPackageAbbreviator;
1716

1817
public final class JsonEncoder extends EncoderBase<ILoggingEvent> {
1918

2019
private static final byte[] EMPTY_BYTES = {};
2120
private final JsonStream json;
2221
private final Map<String, String> customFieldsMap = new HashMap<>();
2322
private final PropertyNames properties;
24-
private final ThrowableHandlingConverter throwableConverter;
23+
private ThrowableHandlingConverter throwableConverter = new ShortenedThrowableConverter();
2524

2625
private DateTimeFormatter formatter;
2726
private TimeZone timeZone = TimeZone.getDefault();
2827
/** Null implies default of ISO_OFFSET_DATE_TIME */
2928
private String timestampPattern;
3029
private int fieldExtra;
30+
private String component;
31+
private String environment;
3132

3233
public JsonEncoder() {
3334
this.json = JsonStream.builder().build();
34-
this.properties =json.properties("@timestamp", "level", "logger", "message", "thread", "stack_trace");
35-
36-
final var converter = new ShortenedThrowableConverter();
37-
converter.setMaxDepthPerThrowable(3);
38-
39-
final var de = new TrimPackageAbbreviator();
40-
de.setTargetLength(20);
41-
converter.setClassNameAbbreviator(de);
42-
converter.setRootCauseFirst(true);
43-
this.throwableConverter = converter;
35+
this.properties = json.properties("component", "env", "timestamp", "level", "logger", "message", "thread", "exception");
4436
}
4537

4638
@Override
@@ -83,18 +75,26 @@ public byte[] encode(ILoggingEvent event) {
8375

8476
try (var writer = json.writer(outputStream)) {
8577
writer.beginObject(properties);
86-
writer.name(0);
78+
if (component != null) {
79+
writer.name(0);
80+
writer.value(component);
81+
}
82+
if (environment != null) {
83+
writer.name(1);
84+
writer.value(environment);
85+
}
86+
writer.name(2);
8787
writer.value(formatter.format(Instant.ofEpochMilli(event.getTimeStamp())));
88-
writer.name(1);
88+
writer.name(3);
8989
writer.value(event.getLevel().toString());
90-
writer.name(2);
90+
writer.name(4);
9191
writer.value(loggerName);
92-
writer.name(3);
92+
writer.name(5);
9393
writer.value(message);
94-
writer.name(4);
94+
writer.name(6);
9595
writer.value(threadName);
9696
if (!stackTraceBody.isEmpty()) {
97-
writer.name(5);
97+
writer.name(7);
9898
writer.value(stackTraceBody);
9999
}
100100
customFieldsMap.forEach((k, v) -> {
@@ -108,10 +108,21 @@ public byte[] encode(ILoggingEvent event) {
108108
writer.endObject();
109109
writer.writeNewLine();
110110
}
111-
112111
return outputStream.toByteArray();
113112
}
114113

114+
public void setComponent(String component) {
115+
this.component = component;
116+
}
117+
118+
public void setEnvironment(String environment) {
119+
this.environment = environment;
120+
}
121+
122+
public void setThrowableConverter(ThrowableHandlingConverter throwableConverter) {
123+
this.throwableConverter = throwableConverter;
124+
}
125+
115126
public void setCustomFields(String customFields) {
116127
if (customFields == null || customFields.isBlank()) {
117128
return;

src/main/java/io/avaje/logback/encoder/StackElementFilter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public abstract class StackElementFilter {
3737
*
3838
* @return the filter
3939
*/
40-
public static final StackElementFilter any() {
40+
public static StackElementFilter any() {
4141
return new StackElementFilter() {
4242
@Override
4343
public boolean accept(StackTraceElement element) {
@@ -53,7 +53,7 @@ public boolean accept(StackTraceElement element) {
5353
*
5454
* @return the filter
5555
*/
56-
public static final StackElementFilter withSourceInfo() {
56+
public static StackElementFilter withSourceInfo() {
5757
return new StackElementFilter() {
5858
@Override
5959
public boolean accept(StackTraceElement element) {
@@ -68,7 +68,7 @@ public boolean accept(StackTraceElement element) {
6868
* @param excludes regular expressions matching {@link StackTraceElement} to filter out
6969
* @return the filter
7070
*/
71-
public static final StackElementFilter byPattern(final List<Pattern> excludes) {
71+
public static StackElementFilter byPattern(final List<Pattern> excludes) {
7272
return new StackElementFilter() {
7373
@Override
7474
public boolean accept(StackTraceElement element) {

src/main/java/io/avaje/logback/encoder/TimeZoneUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import java.time.format.DateTimeFormatter;
55
import java.util.TimeZone;
66

7-
public final class TimeZoneUtils {
7+
final class TimeZoneUtils {
88
/** Keyword used by {@link #setTimeZone(String)} to denote the system default time zone. */
99
private static final String DEFAULT_TIMEZONE_KEYWORD = "[DEFAULT]";
1010

@@ -22,7 +22,7 @@ private TimeZoneUtils() {}
2222
* @throws IllegalArgumentException thrown when the string is not a valid TimeZone textual
2323
* representation.
2424
*/
25-
public static TimeZone parseTimeZone(String str) {
25+
static TimeZone parseTimeZone(String str) {
2626
if (str == null || str.isBlank() || DEFAULT_TIMEZONE_KEYWORD.equalsIgnoreCase(str)) {
2727
return TimeZone.getDefault();
2828
}
@@ -43,7 +43,7 @@ public static TimeZone parseTimeZone(String str) {
4343
return tz;
4444
}
4545

46-
public static DateTimeFormatter formatter(String pattern, ZoneId zoneId) {
46+
static DateTimeFormatter formatter(String pattern, ZoneId zoneId) {
4747
if (pattern == null) {
4848
return DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(zoneId);
4949
}

src/test/java/io/avaje/logback/encoder/JsonEncoderTest.java

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import ch.qos.logback.classic.spi.ILoggingEvent;
44
import ch.qos.logback.classic.spi.LoggingEvent;
55
import io.avaje.json.simple.SimpleMapper;
6+
import io.avaje.logback.encoder.abbreviator.TrimPackageAbbreviator;
67
import org.junit.jupiter.api.Test;
78
import ch.qos.logback.classic.Logger;
89
import org.slf4j.LoggerFactory;
@@ -14,12 +15,20 @@
1415

1516
class JsonEncoderTest {
1617

17-
@Test
18-
void encode() {
19-
String fqcn = "org.example.Foo";
18+
private final String fqcn = "org.example.Foo";
19+
20+
private ILoggingEvent createLogEvent() {
21+
return createLogEvent(null);
22+
}
23+
24+
private ILoggingEvent createLogEvent(Throwable throwable) {
2025
Logger logger = (Logger)LoggerFactory.getLogger(fqcn);
26+
return new LoggingEvent(fqcn, logger, INFO, "Hi", throwable, null);
27+
}
2128

22-
ILoggingEvent event = new LoggingEvent(fqcn, logger, INFO, "Hi", null, null);
29+
@Test
30+
void encode() {
31+
ILoggingEvent event = createLogEvent();
2332

2433
JsonEncoder encoder = new JsonEncoder();
2534
encoder.start();
@@ -28,10 +37,74 @@ void encode() {
2837
SimpleMapper simpleMapper = SimpleMapper.builder().build();
2938
Map<String, Object> asMap = simpleMapper.map().fromJson(bytes);
3039

31-
assertThat((String)asMap.get("@timestamp")).isNotNull();
40+
assertThat((String)asMap.get("component")).isNull();
41+
assertThat((String)asMap.get("env")).isNull();
42+
assertThat((String)asMap.get("timestamp")).isNotNull();
43+
assertThat((String)asMap.get("message")).isEqualTo("Hi");
44+
assertThat((String)asMap.get("level")).isEqualTo("INFO");
45+
assertThat((String)asMap.get("thread")).isEqualTo("main");
46+
assertThat((String)asMap.get("logger")).isEqualTo("org.example.Foo");
47+
}
48+
49+
@Test
50+
void encode_component() {
51+
JsonEncoder encoder = new JsonEncoder();
52+
encoder.setComponent("my-component");
53+
encoder.setEnvironment("dev");
54+
encoder.start();
55+
56+
byte[] bytes = encoder.encode(createLogEvent());
57+
58+
SimpleMapper simpleMapper = SimpleMapper.builder().build();
59+
Map<String, Object> asMap = simpleMapper.map().fromJson(bytes);
60+
61+
assertThat((String)asMap.get("component")).isEqualTo("my-component");
62+
assertThat((String)asMap.get("env")).isEqualTo("dev");
63+
assertThat((String)asMap.get("timestamp")).isNotNull();
3264
assertThat((String)asMap.get("message")).isEqualTo("Hi");
3365
assertThat((String)asMap.get("level")).isEqualTo("INFO");
3466
assertThat((String)asMap.get("thread")).isEqualTo("main");
3567
assertThat((String)asMap.get("logger")).isEqualTo("org.example.Foo");
3668
}
69+
70+
@Test
71+
void throwable_usingDefault() {
72+
JsonEncoder encoder = new JsonEncoder();
73+
encoder.start();
74+
75+
byte[] bytes = encoder.encode(createLogEvent(createThrowable()));
76+
SimpleMapper simpleMapper = SimpleMapper.builder().build();
77+
Map<String, Object> asMap = simpleMapper.map().fromJson(bytes);
78+
79+
assertThat((String)asMap.get("exception")).startsWith("java.lang.NullPointerException: ");
80+
}
81+
82+
@Test
83+
void throwable_usingConverter() {
84+
final TrimPackageAbbreviator trimPackages = new TrimPackageAbbreviator();
85+
trimPackages.setTargetLength(10);
86+
87+
final ShortenedThrowableConverter converter = new ShortenedThrowableConverter();
88+
converter.setMaxDepthPerThrowable(3);
89+
converter.setClassNameAbbreviator(trimPackages);
90+
91+
JsonEncoder encoder = new JsonEncoder();
92+
encoder.setThrowableConverter(converter);
93+
encoder.start();
94+
95+
byte[] bytes = encoder.encode(createLogEvent(createThrowable()));
96+
SimpleMapper simpleMapper = SimpleMapper.builder().build();
97+
Map<String, Object> asMap = simpleMapper.map().fromJson(bytes);
98+
99+
assertThat((String)asMap.get("exception")).startsWith("j.l.NullPointerException: ");
100+
}
101+
102+
Throwable createThrowable() {
103+
try {
104+
System.getProperty("doNotExist").toUpperCase();
105+
return null;
106+
} catch (Throwable e) {
107+
return e;
108+
}
109+
}
37110
}

src/test/java/io/avaje/logback/ShortenedThrowableConverterTest.java renamed to src/test/java/io/avaje/logback/encoder/ShortenedThrowableConverterTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.avaje.logback;
16+
package io.avaje.logback.encoder;
1717

1818
import ch.qos.logback.classic.pattern.Abbreviator;
1919
import ch.qos.logback.classic.spi.ClassPackagingData;
@@ -24,7 +24,6 @@
2424
import ch.qos.logback.core.boolex.EvaluationException;
2525
import ch.qos.logback.core.boolex.EventEvaluator;
2626
import ch.qos.logback.core.pattern.Converter;
27-
import io.avaje.logback.encoder.ShortenedThrowableConverter;
2827

2928
import org.junit.jupiter.api.Test;
3029

src/test/java/io/avaje/logback/abbreviator/CachingAbbreviatorTest.java renamed to src/test/java/io/avaje/logback/encoder/abbreviator/CachingAbbreviatorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.avaje.logback.abbreviator;
16+
package io.avaje.logback.encoder.abbreviator;
1717

1818
import ch.qos.logback.classic.pattern.Abbreviator;
1919
import io.avaje.logback.encoder.abbreviator.CachingAbbreviator;

src/test/java/io/avaje/logback/abbreviator/TrimPackageAbbreviatorTest.java renamed to src/test/java/io/avaje/logback/encoder/abbreviator/TrimPackageAbbreviatorTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package io.avaje.logback.abbreviator;
16+
package io.avaje.logback.encoder.abbreviator;
1717

1818
import org.junit.jupiter.api.Test;
1919

0 commit comments

Comments
 (0)