Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ To see additional configuration options take a look at [Config](https://quarkive
quarkus.log.console.json.log-format=ecs
```

## Google Cloud Platform Scheme
this follows the example of log4j2 and will duplicate the exception into the message
```properties
quarkus.log.console.json.log-format=gcp
```

# Add additional fields to all log messages
If you want to add a static field to all the log message, that is possible using the configuration.
```properties
Expand Down
15 changes: 14 additions & 1 deletion runtime/src/main/java/io/quarkiverse/loggingjson/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,18 @@ public static class FieldsConfig {
*/
@ConfigItem
public FieldConfig errorMessage;

/**
* Options for wrappedErrorMessage.
*/
@ConfigItem
public FieldConfig wrappedError;

/**
* Options for wrappedSourceLocation.
*/
@ConfigItem
public FieldConfig wrappedSourceLocation;
}

@ConfigGroup
Expand Down Expand Up @@ -242,6 +254,7 @@ public enum AdditionalFieldType {

public enum LogFormat {
DEFAULT,
ECS
ECS,
GCP
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ public RuntimeValue<Optional<Formatter>> initializeJsonLogging(Config config, bo

if (config.logFormat == Config.LogFormat.ECS) {
providers = ecsFormat(config);
}
if (config.logFormat == Config.LogFormat.GCP) {
providers = gcpFormat(config);
} else {
providers = defaultFormat(config);
}
Expand Down Expand Up @@ -105,4 +108,35 @@ private List<JsonProvider> ecsFormat(Config config) {
providers.add(new StaticKeyValueProvider("ecs.version", "1.12.1"));
return providers;
}

private List<JsonProvider> gcpFormat(Config config) {
List<JsonProvider> providers = new ArrayList<>();
providers.add(new TimestampJsonProvider(config.fields.timestamp, "timestamp"));
providers.add(new LogLevelJsonProvider(config.fields.level, "severity"));
providers.add(new MessageWithErrorJsonProvider(config.fields.message));

providers.add(new SequenceJsonProvider(config.fields.sequence, "logging.googleapis.com/insertId")); // must be unique

WrappedSourceLocation location = new WrappedSourceLocation(config.fields.wrappedError,
"logging.googleapis.com/sourceLocation",
new JsonProvider[] {
new LoggerNameJsonProvider(config.fields.loggerName, "function")
});
providers.add(location);

WrappedError error = new WrappedError(config.fields.wrappedError, "_exception",
new JsonProvider[] {
new ErrorTypeJsonProvider(config.fields.errorType, "class"),
new ErrorMessageJsonProvider(config.fields.errorMessage, "message"),
new StackTraceJsonProvider(config.fields.stackTrace, "stackTrace")
});
providers.add(error);

providers.add(new ThreadNameJsonProvider(config.fields.threadName, "_thread"));
providers.add(new LoggerNameJsonProvider(config.fields.loggerName, "_logger"));

providers.add(new MDCJsonProvider(config.fields.mdc, "logging.googleapis.com/labels"));

return providers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@ public class MDCJsonProvider implements JsonProvider, Enabled {
private final Config.MDCConfig config;

public MDCJsonProvider(Config.MDCConfig config) {
this(config, "mdc");
}

public MDCJsonProvider(Config.MDCConfig config, String defaultName) {
this.config = config;
if (config.flatFields) {
this.fieldName = null;
} else {
this.fieldName = config.fieldName.orElse("mdc");
this.fieldName = config.fieldName.orElse(defaultName);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package io.quarkiverse.loggingjson.providers;

import java.io.IOException;
import java.io.PrintWriter;

import org.jboss.logmanager.ExtFormatter;
import org.jboss.logmanager.ExtLogRecord;

import io.quarkiverse.loggingjson.Config;
import io.quarkiverse.loggingjson.Enabled;
import io.quarkiverse.loggingjson.JsonGenerator;
import io.quarkiverse.loggingjson.JsonProvider;
import io.quarkiverse.loggingjson.JsonWritingUtils;
import io.quarkiverse.loggingjson.StringBuilderWriter;

public class MessageWithErrorJsonProvider extends ExtFormatter implements JsonProvider, Enabled {

private final String fieldName;
private final Config.FieldConfig config;

public MessageWithErrorJsonProvider(Config.FieldConfig config) {
this.config = config;
this.fieldName = config.fieldName.orElse("message");
}

@Override
public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException {
final StringBuilderWriter w = new StringBuilderWriter();
w.append(formatMessage(event));
if (event.getThrown() != null) {
w.append("\n");
event.getThrown().printStackTrace(new PrintWriter(w));
}
JsonWritingUtils.writeStringField(generator, fieldName, w.toString());
}

@Override
public String format(ExtLogRecord record) {
return null;
}

@Override
public boolean isEnabled() {
return config.enabled.orElse(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,12 @@ public class SequenceJsonProvider implements JsonProvider, Enabled {
private final Config.FieldConfig config;

public SequenceJsonProvider(Config.FieldConfig config) {
this(config, "sequence");
}

public SequenceJsonProvider(Config.FieldConfig config, String defaultName) {
this.config = config;
this.fieldName = config.fieldName.orElse("sequence");
this.fieldName = config.fieldName.orElse(defaultName);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.quarkiverse.loggingjson.providers;

import java.io.IOException;

import org.jboss.logmanager.ExtLogRecord;

import io.quarkiverse.loggingjson.Config;
import io.quarkiverse.loggingjson.Enabled;
import io.quarkiverse.loggingjson.JsonGenerator;
import io.quarkiverse.loggingjson.JsonProvider;

public class WrappedError implements JsonProvider, Enabled {

private final String fieldName;
private final Config.FieldConfig config;
private final JsonProvider[] providers;

public WrappedError(Config.FieldConfig config, JsonProvider[] providers) {
this(config, "error", providers);
}

public WrappedError(Config.FieldConfig config, String defaultName, JsonProvider[] providers) {
this.config = config;
this.fieldName = config.fieldName.orElse(defaultName);
this.providers = providers;
}

@Override
public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException {
generator.writeObjectFieldStart(fieldName);
for (JsonProvider p : providers) {
p.writeTo(generator, event);
}
generator.writeEndObject();
}

@Override
public boolean isEnabled() {
return config.enabled.orElse(true);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package io.quarkiverse.loggingjson.providers;

import java.io.IOException;

import org.jboss.logmanager.ExtLogRecord;

import io.quarkiverse.loggingjson.Config;
import io.quarkiverse.loggingjson.Enabled;
import io.quarkiverse.loggingjson.JsonGenerator;
import io.quarkiverse.loggingjson.JsonProvider;

public class WrappedSourceLocation implements JsonProvider, Enabled {

private final String fieldName;
private final Config.FieldConfig config;
private final JsonProvider[] providers;

public WrappedSourceLocation(Config.FieldConfig config, JsonProvider[] providers) {
this(config, "error", providers);
}

public WrappedSourceLocation(Config.FieldConfig config, String defaultName, JsonProvider[] providers) {
this.config = config;
this.fieldName = config.fieldName.orElse(defaultName);
this.providers = providers;
}

@Override
public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException {
generator.writeObjectFieldStart(fieldName);
for (JsonProvider p : providers) {
p.writeTo(generator, event);
}
generator.writeEndObject();
}

@Override
public boolean isEnabled() {
return config.enabled.orElse(true);
}

}