diff options
| -rw-r--r-- | README.adoc | 222 | 
1 files changed, 222 insertions, 0 deletions
| diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..3136880 --- /dev/null +++ b/README.adoc @@ -0,0 +1,222 @@ += Quarkus Google Cloud JSON Logging +Matthias Andreas Benkard +// Meta +:experimental: +:data-uri: +:sectnums: +:toc: +:stem: +:toclevels: 2 +:description: Quarkus Google Cloud JSON Logging Manual +:keywords: mulk +// Settings +:icons: font +:source-highlighter: rouge + + +Structured logging to standard output according to the Google Cloud +Logging specification. + + +== Summary + +This package contains a log formatter for JBoss Logging in the form of +a Quarkus plugin that implements the +https://cloud.google.com/logging/docs/structured-logging[Google Cloud +Logging JSON format] on standard output. + +It is possible to log unstructured text, structured data, or a mixture +of both depending on the situation. + + + +To run the application with live reloading enabled: + +[source,console] +---- +$ ./mvnw quarkus:dev +---- + + +== Activation + +Add the runtime POM to your dependency list. As long as the JAR is on +the classpath at both build time and runtime, the log formatter +automatically registers itself on startup. + + +=== Activation with Maven + +[source,xml] +---- +<project> +  ... + +  <dependencies> +    ... + +    <dependency> +      <groupId>eu.mulk.quarkus-googlecloud-jsonlogging</groupId> +      <artifactId>quarkus-googlecloud-jsonlogging</artifactId> +      <version>3.1.0</version> +    </dependency> + +    ... +  </dependencies> + +  ... +</project> +---- + + +=== Activation with Gradle + +[source,groovy] +---- +dependencies { +  ... + +  implementation("eu.mulk.quarkus-googlecloud-jsonlogging:quarkus-googlecloud-jsonlogging:3.1.0") + +  ... +} +---- + + +== Usage + +Logging unstructured data requires no code changes. All logs are +automatically converted to Google-Cloud-Logging-compatible JSON. + +Structured data can be logged in one of 3 different ways: by passing +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/Label.html[Label]s +and +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameter.html[StructuredParameter]s +as parameters to individual log entries, by supplying +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.html[LabelProvider]s +and +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.html[StructuredParameterProvider]s, +or by using the Mapped Diagnostic Context. + + +=== Using Label and StructuredParameter + +Instances of +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/Label.html[Label] +and +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameter.html[StructuredParameter] +can be passed as log parameters to the `*f` family of logging +functions on JBoss Logging's +https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/Logger.html[Logger]. + +Simple key–value pairs are represented by +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/KeyValueParameter.html[KeyValueParameter]. + +**Example:** + +[source,java] +---- +logger.logf( +  "Request rejected: unauthorized.", +  Label.of("requestId", "123"), +  KeyValueParameter.of("resource", "/users/mulk"), +  KeyValueParameter.of("method", "PATCH"), +  KeyValueParameter.of("reason", "invalid token")); +---- + +Result: + +[source,json] +---- +{ +  "jsonPayload": { +    "message": "Request rejected: unauthorized.", +    "resource": "/users/mulk", +    "method": "PATCH", +    "reason": "invalid token" +  }, +  "labels": { +    "requestId": "123" +  } +} +---- + + +=== Using LabelProvider and StructuredParameterProvider + +Any CDI beans that implement +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/LabelProvider.html[LabelProvider] +and +https://javadocs.dev/eu.mulk.quarkus-googlecloud-jsonlogging/quarkus-googlecloud-jsonlogging/3.1.0/eu.mulk.quarkus.googlecloud.jsonlogging/eu/mulk/quarkus/googlecloud/jsonlogging/StructuredParameterProvider.html[StructuredParameterProvider] +are discovered at build time and consulted to provide labels and +parameters for each message that is logged.  This can be used to +provide contextual information such as tracing and request IDs stored +in thread-local storage. + +**Example:** + +[source,java] +---- +@Singleton +@Unremovable +public final class TraceLogParameterProvider implements StructuredParameterProvider, LabelProvider { + +  @Override +  public StructuredParameter getParameter() { +    var b = Json.createObjectBuilder(); +    b.add("traceId", Span.current().getSpanContext().getTraceId()); +    b.add("spanId", Span.current().getSpanContext().getSpanId()); +    return () -> b; +  } + +  @Override +  public Collection<Label> getLabels() { +    return List.of(Label.of("requestId", "123")); +  } +} +---- + +Result: + +[source,json] +---- +{ +  "jsonPayload": { +    "message": "Request rejected: unauthorized.", +    "traceId": "39f9a49a9567a8bd7087b708f8932550", +    "spanId": "c7431b14630b633d" +  }, +  "labels": { +    "requestId": "123" +  } +} +---- + + +=== Using the Mapped Diagnostic Context + +Any key–value pairs in JBoss Logging's thread-local +https://docs.jboss.org/jbosslogging/latest/org/jboss/logging/MDC.html[MDC] +are added to the resulting JSON. + +**Example:** + +[source,java] +---- +MDC.put("resource", "/users/mulk"); +MDC.put("method", "PATCH"); +logger.logf("Request rejected: unauthorized."); +---- + +Result: + +[source,json] +---- +{ +  "jsonPayload": { +    "message": "Request rejected: unauthorized.", +    "resource": "/users/mulk", +    "method": "PATCH" +  } +} +---- | 
