Журналирование загрузчика стека при загрузке - это textPayload, а не jsonPayload - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть фильтр журнала, который выводит важную информацию о запросах для отладки и анализа журнала.Но, как вы можете видеть, текстовое наполнение действительно трудно читать.

Мне не нужно каждый раз копировать + вставлять эту текстовую информацию в текстовый редактор.Есть ли способ заставить драйвер стека печатать это в виде разборного 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())
                    }
                }
    }

}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Стандартная конфигурация агента ведения журнала Stackdriver для Kubernetes обнаружит однострочный JSON и преобразует его в jsonPayload.Вы можете сконфигурировать Spring для регистрации в виде однострочного JSON (например, через JsonLayout 1 ) и позволить агенту ведения журнала подобрать объект JSON (см. https://cloud.google.com/logging/docs/agent/configuration#process-payload).

1 Некоторые из имен полей JSON отличаются (например, JsonLayout использует "уровень" для уровня журнала, в то время как агент ведения журнала Stackdriver распознает"серьезность"), поэтому вам, возможно, придется переопределитьaddCustomDataToJsonMap для полного управления полученными записями журнала.

См. Также GKE & Stackdriver: формат ведения журнала регистрации Java?

0 голосов
/ 29 апреля 2019

Что вам нужно будет сделать, это настроить Fluentd в GKE . В значительной степени это создание демона Fluend для ведения журнала вместо метода ведения журнала по умолчанию.

Как только это будет сделано, вы можете настроить структурированное ведение журнала для отправки журналов jsonPayload в ведение журнала Stackdriver.

...