Maven coordinates, using Spring Cloud GCP BOM:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gcp-starter-logging</artifactId> </dependency>
Gradle coordinates:
dependencies { compile group: 'org.springframework.cloud', name: 'spring-cloud-gcp-starter-logging' }
Stackdriver Logging is the managed logging service provided by Google Cloud Platform.
This module provides support for associating a web request trace ID with the corresponding log entries. This allows grouping of log messages by request.
![]() | Note |
---|---|
Due to the way logging is set up, the GCP project ID and credentials defined in
|
TraceIdLoggingWebMvcInterceptor
extracts the request trace ID from an HTTP request using a
TraceIdExtractor
and stores it in a thread-local of the TraceLoggingEnhancer
which can then be used in a logging appender to add the trace ID metadata to log messages.
There are implementations provided for TraceIdExtractor
:
Extractor | Description |
---|---|
| Checks the |
| Checks the |
| Instantiated with a list of other |
LoggingWebMvcConfigurer
configuration class is also provided to help register the TraceIdLoggingWebMvcInterceptor
in Spring MVC applications.
Currently, Java Util Logging (JUL) and Logback are supported.
There are 2 possibilities to log to Stackdriver via this library with Logback:
For Logback, a org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml
file is
made available for import to make it easier to configure the Logback appender.
Your configuration may then look something like this:
<configuration> <include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" /> <root level="INFO"> <appender-ref ref="STACKDRIVER" /> </root> </configuration>
STACKDRIVER_LOG_NAME
and STACKDRIVER_LOG_FLUSH_LEVEL
environment variables can be used to customize the
STACKDRIVER
appender.
Also see the spring-cloud-gcp-starter-logging module.
If you run your Spring Boot application in a Kubernetes cluster in the Google Cloud (GKE) or on App Engine flexible
environment, you can log JSON directly from the console by including
org/springframework/cloud/gcp/logging/logback-json-appender.xml
. The traceId will be set
correctly.
You need the additional dependency:
<dependency> <groupId>ch.qos.logback.contrib</groupId> <artifactId>logback-json-classic</artifactId> <version>0.1.5</version> </dependency>
Your Logback configuration may then look something like this:
<configuration> <property name="projectId" value="test-project"/> <include resource="org/springframework/cloud/gcp/logging/logback-json-appender.xml" /> <root level="INFO"> <appender-ref ref="CONSOLE_JSON"/> </root> </configuration>
If you want to have more control over the log output, you can also configure the ConsoleAppender
yourself.
The following properties are available:
Property | Default Value | Description |
---|---|---|
| Only required for logging the correct traceId: | |
|
| Should the |
|
| Should the |
|
| Should the severity be included |
|
| Should the thread name be included |
|
| Should all MDC properties be included. The MDC properties |
|
| Should the name of the logger be included |
|
| Should the formatted log message be included. |
|
| Should the stacktrace be appended to the formatted log message. This setting is only evaluated if |
|
| Should the logging context be included |
|
| Should the log message with blank placeholders be included |
|
| Should the stacktrace be included as a own field |
This is an example of such an Logback configuration:
<configuration > <property name="projectId" value="${projectId:-${GOOGLE_CLOUD_PROJECT}}"/> <appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="org.springframework.cloud.gcp.logging.StackdriverJsonLayout"> <projectId>${projectId}</projectId> <!--<includeTraceId>true</includeTraceId>--> <!--<includeSpanId>true</includeSpanId>--> <!--<includeLevel>true</includeLevel>--> <!--<includeThreadName>true</includeThreadName>--> <!--<includeMDC>true</includeMDC>--> <!--<includeLoggerName>true</includeLoggerName>--> <!--<includeFormattedMessage>true</includeFormattedMessage>--> <!--<includeExceptionInMessage>true</includeExceptionInMessage>--> <!--<includeContextName>true</includeContextName>--> <!--<includeMessage>false</includeMessage>--> <!--<includeException>false</includeException>--> </layout> </encoder> </appender> </configuration>