【发布时间】:2018-07-18 23:55:48
【问题描述】:
我有一个在 Kubernetes 集群和 EFK 堆栈中运行的 Spring Boot 应用程序(如 ELK,但使用 Fluentd 代替 Logstash,它被用作轻量级的替代方案从所有 kubernetes pod 收集日志并将它们发送到 elasticsearch)。
为了使日志适应 JSON 输出,我使用了 logstash-logback-encoder 库:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
开箱即用,我将日志转换为 JSON(这很棒)。
我登录到 STDOUT,所有内容都被提取并发送到 Elasticsearch。 在 Spring Boot 应用程序中不需要特殊的日志配置。
但问题我现在遇到的问题是,在从 Kubernetes pod 的 STDOUT 实时读取我的日志时,使用所有 JSON 格式很难读取它们。
例子:
{"@timestamp":"2018-02-08T12:49:06.080+01:00","@version":1,"message":"Mapped \"{[/error],produces=[text/html]}\" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)","logger_name":"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.080+01:00","@version":1,"message":"Mapped \"{[/error]}\" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)","logger_name":"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.098+01:00","@version":1,"message":"Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]","logger_name":"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.098+01:00","@version":1,"message":"Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]","logger_name":"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.137+01:00","@version":1,"message":"Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]","logger_name":"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.268+01:00","@version":1,"message":"Registering beans for JMX exposure on startup","logger_name":"org.springframework.jmx.export.annotation.AnnotationMBeanExporter","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.333+01:00","@version":1,"message":"Initializing ProtocolHandler [\"http-nio-8080\"]","logger_name":"org.apache.coyote.http11.Http11NioProtocol","thread_name":"main","level":"INFO","level_value":20000}
{"@timestamp":"2018-02-08T12:49:06.355+01:00","@version":1,"message":"Starting ProtocolHandler [\"http-nio-8080\"]","logger_name":"org.apache.coyote.http11.Http11NioProtocol","thread_name":"main","level":"INFO","level_value":20000}
我要做的是以“普通非 JSON”格式登录到 STDOUT,然后以 JSON 格式将日志发送到 Fluentd。
我正在尝试配置两个日志附加器(一个用于 STDOUT,另一个用于 Fluentd 的 JSON 格式)但我很确定这会复制数据(Fluentd 将获得 JSON 格式和 STDOUT)。
我的 B 计划是构建一个用于部署的映像(不使用 JSON 格式),另一个用于生产,但这更像是 Z 计划,因为我也想在生产中监控这些 pod。
我的问题是如何使用可能的一个日志附加程序或不复制 Fluentd 中的数据来做到这一点。有没有我没有想到的不同方法?
【问题讨论】: