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