Quarkus logging extension outputting the log messages in JSON. It supports the following formats: default, Elastic Common Schema (ECS).
| Quarkus Version | Use version |
|---|---|
| 3.x.x | 3.x.x |
| 2.x.x | 1.x.x, 2.x.x |
The extension is enabled by default for console and socket, when added to the project.
Console json logging can be disabled using configuration: quarkus.log.json.console.enabled=false
Socket json logging can be disabled using configuration: quarkus.log.json.socket.enabled=false
To see additional configuration options take a look at Config
quarkus.log.json.log-format=ecsIf you want to add a static field to all the log message, that is possible using the configuration.
quarkus.log.json.additional-field.serviceName.value=service-a
# type is by default STRING - Other is INT, LONG, FLOAT, DOUBLE
quarkus.log.json.additional-field.buildNumber.type=INT
quarkus.log.json.additional-field.buildNumber.value=42If you want to do structured logging of arguments, then the argument send with your logging, can implement io.quarkiverse.loggingjson.providers.StructuredArgument. Then it is possible to use the JsonGenerator to format the argument in json.
import static io.quarkiverse.loggingjson.providers.KeyValueStructuredArgument.*;
...
log.info("Test log of structured arg", kv("key", "value"));If you want to add your own custom way to handle the LogRecords.
You can create your own implementations of io.quarkiverse.loggingjson.JsonProvider, and provide it using CDI.
Example implementation:
import jakarta.inject.Singleton;
import java.io.IOException;
import io.quarkiverse.loggingjson.JsonProvider;
import io.quarkiverse.loggingjson.JsonGenerator;
import org.jboss.logmanager.ExtLogRecord;
@Singleton
public class MyJsonProvider implements JsonProvider {
@Override
public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException {
generator.writeStringField("myCustomField", "and my custom value"); // Will be added to every log, as a field on the json.
}
}Sometimes there is a need for a fully customized json output (e.g. for support of corporate json log format): The usual adjustment methods of the log output are not sufficient, if some of the existing providers are needed to be moved down the json object tree to some subobject inside attributes (e.g. put the message inside a json data object data.message).
In such cases the idea is to start with an empty format by adding
quarkus.log.json.log-format=noneto the configuration. This format doesn't add any fields to the json output and ignores any field specific configuration. Next you need to implement the full json output yourself, by writing a custom JsonProvider implementation (here putting the message inside the data object):
import jakarta.inject.Singleton;
import java.io.IOException;
import io.quarkiverse.loggingjson.JsonProvider;
import io.quarkiverse.loggingjson.JsonGenerator;
import org.jboss.logmanager.ExtLogRecord;
@Singleton
public class FullyCustomizedJsonProvider implements JsonProvider {
@Override
public void writeTo(JsonGenerator generator, ExtLogRecord event) throws IOException {
generator.writeObjectField("data", Map.of("message", event.getMessage())); // outputs the message inside a data object
}
}In the above example, the message is just written plain, see MessageJsonProvider for an example on how to write the message formatted for being written into json.
In 3.2.0, two configuration properties were renamed to be more consistent with Quarkus configuration.
- Old:
quarkus.log.json.console.enable→ New:quarkus.log.json.console.enabled - Old:
quarkus.log.json.file.enable→ New:quarkus.log.json.file.enabled
A relocation/fallback mechanism has been added so the old properties are still supported
but we recomment that you switch to the new ones
(quarkus update will do it for you).
Thanks goes to these wonderful people (emoji key):
Simon Bengtsson 💻 🚧 |
This project follows the all-contributors specification. Contributions of any kind welcome!
`