微服務日誌調用鏈事件(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
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章