【问题标题】:Spring boot stackdriver logging is textPayload and not jsonPayloadSpring Boot 堆栈驱动程序日志记录是 textPayload 而不是 jsonPayload
【发布时间】:2019-04-30 04:10:43
【问题描述】:

我有一个日志过滤器,用于记录调试和日志分析的基本请求信息。但是正如您所看到的,文本有效负载真的很难阅读。

我不想每次都将此文本有效负载复制并粘贴到文本编辑器中。有没有办法让堆栈驱动程序在可折叠的 json 中打印它?

更多信息: - GKE 吊舱

@Component
class LogFilter : WebFilter {

    private val logger = LoggerFactory.getLogger(LogFilter::class.java)

    override fun filter(exchange: ServerWebExchange, chain: WebFilterChain): Mono<Void> {
        return chain
                .filter(exchange)
                .doAfterTerminate {
                    val request = exchange.request
                    val path = request.uri.path
                    val routesToExclude = listOf("actuator")
                    var isExcludedRoute = false

                    for (r in routesToExclude) { if (path.contains(r)) { isExcludedRoute = true; break; } }

                    if (!isExcludedRoute) {
                        val startTime = System.currentTimeMillis()
                        val statusCode = exchange.response.statusCode?.value()
                        val requestTime = System.currentTimeMillis() - startTime
                        val msg = "Served $path as $statusCode in $requestTime msec"
                        val requestPrintMap = mutableMapOf<Any, Any>()
                        requestPrintMap["method"] = if (request.method != null) {
                            request.method.toString()
                        } else "UNKNOWN"
                        requestPrintMap["path"] = path.toString()
                        requestPrintMap["query_params"] = request.queryParams
                        requestPrintMap["headers"] = request.headers

                        requestPrintMap["status_code"] = statusCode.toString()
                        requestPrintMap["request_time"] = requestTime
                        requestPrintMap["msg"] = msg

                        logger.info(JSONObject(requestPrintMap).toString())
                    }
                }
    }

}

【问题讨论】:

    标签: spring-boot logging google-kubernetes-engine stackdriver


    【解决方案1】:

    您需要做的是customize Fluentd in GKE。它几乎是在为日志记录创建 Fluend 守护程序集,而不是默认的日志记录方法。

    完成后,您可以设置 structured logging 以将 jsonPayload logs 发送到 Stackdriver Logging。

    【讨论】:

      【解决方案2】:

      Kubernetes 的默认 Stackdriver 日志记录代理配置将检测单行 JSON 并将其转换为 jsonPayload。您可以将 Spring 配置为以单行 JSON 记录(例如,通过 JsonLayout1)并让记录代理获取 JSON 对象(请参阅 https://cloud.google.com/logging/docs/agent/configuration#process-payload)。

      1一些 JSON 字段名称不同(例如,JsonLayout 使用“级别”作为日志级别,而 Stackdriver 日志代理 recognizes“严重性”),因此您可以必须覆盖 addCustomDataToJsonMap 才能完全控制生成的日志条目。

      另见GKE & Stackdriver: Java logback logging format?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-10
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-16
        • 2019-01-11
        相关资源
        最近更新 更多