Spring启动stackdriver日志记录是textPayload而不是jsonPayload

问题描述 投票:0回答:2

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

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

image of text payload in stackdriver

更多信息: - GKE pod

@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
2个回答
0
投票

你需要做的是customize Fluentd in GKE。几乎它正在创建一个用于记录的Fluend守护进程而不是默认的记录方法。

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


0
投票

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

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

另见GKE & Stackdriver: Java logback logging format?

© www.soinside.com 2019 - 2024. All rights reserved.