微服务日志调用链事件(request-id),从nginx到elk

Nginx生成request-id

  • 每次请求通过nginx时,生成一个request-id,添加到请求头上。
  • 通过nginx内置的 $request_id 实现
proxy_set_header X-Request-Id $request_id;

springCloudGateway保存并传递request-id

  • logstash在springboot logback.xml中的配置
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>localhost:4560</destination>
    <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
  • 把destination写到配置文件中
// logback.xml
 <springProperty scope="context" name="logstashDest" source="logging.config.logstash.dest"/>
 
 <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${logstashDest}</destination>
    <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>

这样,就可以通过properties文件配置:

logging.config.logstash.dest=localhos:8888
  • 定时日志的输出格式

service-id,host,request-id,timestamp,level,thread

//变量定义
  <springProperty scope="context" name="serviceId" source="spring.application.name"/>
  
   <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>${logstashDest}</destination>
       <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <pattern>
                    <pattern>{"service": "${serviceId}", "host": "${host}", "timestamp": "%st", "level": "%level", "thread": "%thread", "request_id": "%X{request}", "class": "%logger","message": "%msg"}</pattern>
                </pattern>
            </providers>
        </encoder>
</appender>
  • 在gateway中定义一个过滤器,将ruquestId从http header中取出,放入MDC。
  • 通过构造自己的spring boot starter来复用日志组件

logstash保存request-id

//logstash的配置文件
input {
  tcp {
    port => 12345
    codec => json
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章