2

Added MDC to logs to be able track specific error logs in Stackdriver Dashboard and Logging Console. Current implementation is working fine on local machine but on cloud it is not - just don't include my MDC to log entry. The problem is that I cannot figure out what might be a problem at all.

Local logs output(contains "contextKey": "someValue"):

{"traceId":"615b35dc7f639027","spanId":"615b35dc7f639027","spanExportable":"false","contextKey":"someValue","timestampSeconds":1552311117,"timestampNanos":665000000,"severity":"ERROR","thread":"reactor-http-nio-3","logger":"com.example.someservice.controller.MyController", ...}

Kubernetes container log of the same service(no "contextKey": "someValue" in this log entry):

{"traceId":"8d7287fa0ebdacfce9b88097e290ecbf","spanId":"96967afbe05dbf0e","spanExportable":"false","X-B3-ParentSpanId":"224dcb9869488858","parentId":"224dcb9869488858","timestampSeconds":1552312549,"timestampNanos":752000000,"severity":"ERROR","thread":"reactor-http-epoll-2","logger":"com.example.someservice.controller.MyController","message":"Something went wrong","context":"default","logging.googleapis.com/trace":"projects/my-project/traces/8d7287fa0ebdacfce9b88097e290ecbf","logging.googleapis.com/spanId":"96967afbe05dbf0e"}

My logback.xml:

<configuration>

    <appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.springframework.cloud.gcp.autoconfigure.logging.StackdriverJsonLayout">
                <projectId>${projectId}</projectId>
            </layout>
        </encoder>
    </appender>

    <springProfile name="local,dev,test">
        <root level="INFO">
            <appender-ref ref="CONSOLE_JSON"/>
        </root>
    </springProfile>
</configuration>

Controller which trigger log creation with defined MDC:

@RestController
@RequestMapping("v1/my-way")
@Slf4j
public class MyController {

    @GetMapping
    public void read() {
        MDC.put("contextKey", "someValue");
        log.error("Something went wrong");
        MDC.remove("contextKey")
    }

}
Viktor V.
  • 3,413
  • 8
  • 32
  • 58

1 Answers1

0

Your MDC fields should be available at "labels" node of log entity. Did you check there?

Also at Google Console in Logs Viewer it's nice to set MDC fields to be shown in logs records. For that set "labels.YouCustomMDCField: at View Options -> Modify custom fields (at right top of the screen)

Update: However you're using different approach than me for log to Stackdriver. Im using

<appender name="STACKDRIVER" class="com.google.cloud.logging.logback.LoggingAppender">
    <log>
        ${log_file_name}
    </log>
</appender>

and it's do the trick (me also has Spring).

stud3nt
  • 1,792
  • 1
  • 8
  • 19
DmitriyS
  • 41
  • 3