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
}
}