我有一个日志过滤器,用于记录调试和日志分析的基本请求信息。但正如您所看到的,文本有效负载实际上很难阅读。
我不想每次都将这个文本有效负载复制+粘贴到文本编辑器中。有没有办法让堆栈驱动程序在可折叠的json中打印出来?
更多信息: - 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())
}
}
}
}
你需要做的是customize Fluentd in GKE。几乎它正在创建一个用于记录的Fluend守护进程而不是默认的记录方法。
完成后,您可以设置structured logging将jsonPayload logs发送到Stackdriver Logging。
Kubernetes的默认Stackdriver日志代理配置将检测单行JSON并将其转换为jsonPayload
。您可以将Spring配置为单行JSON(例如,通过JsonLayout
1),并让日志记录代理获取JSON对象(请参阅https://cloud.google.com/logging/docs/agent/configuration#process-payload)。
1某些JSON字段名称不同(例如,JsonLayout
使用“level”作为日志级别,而Stackdriver日志代理程序使用recognizes“severity”),因此您可能必须重写addCustomDataToJsonMap
才能完全控制生成的日志条目。