背景

我们公司项目组用的是elastic的一整套技术栈,es,kibana,filebeat和apm,目前已经可以采集网关+各个微服务的日志。

架构图

现在需要在原来的基础上把nginx这的日志也采集上来,方便做链路跟踪

问题与思路

原先traceId是在网关这层产生并且传递下去,因为nginx并不是java实现,没办法用agent方式处理,那么如何在nginx这层产生traceId 并且传递下去?

想到2种解决办法

nginx在1.11版本之后可以在http的header头设置request。

参考nginx 文档 http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_id

那么解决起来就简单了,在nginx开始的时候设置requestId,注意header里面的key必须是服务elastic的APM规范,让他可以识别出来是trace id。(这边只是给下思路,并没有实际去操作)

在响应的response设置traceid

因为nginx是在请求结束才打印日志,那么可以在gateway写一个filter,在response设置traceId,然后去nginx就可以获取的到traceid

思路二实战

设置nginx的日志格式

vi /{nginx_home}/conf/nginx.conf

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $request_time $request_length $bytes_sent $body_bytes_sent ''$http_host $sent_http_traceid ''"$upstream_addr" "$upstream_status" "$upstream_response_time" ''"$http_referer" "$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main;

设置nginx输出的日志格式 主要关注 $sent_http_traceid 用来获取header里的traceid

修改完文件之后 记得重新加载 ./nginx -s reload

设置filebeat采集nginx日志

filebeat.inputs:
- type: log #多类日志需定义多个typeenabled: truepaths:- D:\nginx-1.23.2\logs\access.*exclude_files: ['\.gz$']encoding: utf-8fields:service_name: test1service_environment: testtype: nginx.access####### nginx error 日志文件 ########
- type: logenabled: truepaths:- D:\nginx-1.23.2\logs\error.*exclude_files: ['\.gz$']encoding: utf-8fields:service_name: test1service_environment: testtype: nginx.error

这边只展示了nginx的日志采集的input,主要是注意修改nginx的日志目录

在网关项目添加代码

添加maven依赖

 <dependency><groupId>co.elastic.apm</groupId><artifactId>apm-agent-api</artifactId><version>1.30.1</version>
</dependency>

增加filter,在请求头添加traceId

import cn.hutool.core.collection.ListUtil;
import co.elastic.apm.api.ElasticApm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;
/*** 设置trace id*/
@Component
@Order(3)
@Slf4j
public class ApmTraceIdFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {String apmTraceId = ElasticApm.currentTransaction().getTraceId();;exchange.getResponse().getHeaders().put("traceid", ListUtil.toList(apmTraceId));log.info("ApmTraceIdFilter设置trace.id:{}",apmTraceId);return chain.filter(exchange);}}

如果WebFilter获取不到trace.id,那么可以试试用spring cloud gateway的 filter
key必须是traceid,和前面nginx的sent_http_traceid有关联

以上都做完各自重启查看效果

最终效果

先查看nginx的日志

很好,已经获取到traceid

然后去kibana看整体的效果

搞定,下班

filebeat采集nginx日志相关推荐

  1. 通过filebeat、logstash、rsyslog采集nginx日志的几种方式

    由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器.而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一.如何有效便捷的 ...

  2. 部署filebeat收集nginx日志

    搭建filebeat自动发现日志 在上一篇博客我们部署了logstash去读取日志,但是logstash需要消耗的资源较大.在每台客户端安装logstash不现实. Filebeat是一个轻量级的日志 ...

  3. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 使用FileBeat采集Kafka日志到Elasticsearch 一.需求分 ...

  4. 采集Nginx日志的几种方式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://dwz.cn/ofiCxRK0 ...

  5. 闭眼入!采集 Nginx 日志的几种方式!

    作者:xiejava 来源:cnblogs.com/xiejava/p/12452434.html 由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服 ...

  6. Filebeat配置module采集nginx日志

    环境 CentOS 7.3 Filebeat 7.6.0 (Filebeat安装和基本使用参考这里) Elasticsearch 7.6.0 Nginx Module Filebeat集成了大量的mo ...

  7. 微服务架构日志集中化 安装 EFK (Fluentd ElasticSearch Kibana) 采集nginx日志

    本文描述如何通过FEK组合集中化nginx的访问日志.本人更喜欢按顺序来命名,所以使用FEK而不是EFK. 首先在nginx服务器上执行以下操作. 安装ruby http://blog.csdn.ne ...

  8. elasticsearch查询filebeat采集的日志

    依赖 不要问为什么不用7或者8,因为不会 <dependency><groupId>org.elasticsearch.client</groupId><ar ...

  9. ELK 收集 Nginx 日志

    01 安装 Nginx 和 ab 工具 1.1 安装 nginx sudo apt-get install nginx -y # 安装Nginx sudo apt-get install apache ...

最新文章

  1. Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
  2. CAD绘图软件中如何查询图纸的版本是多少
  3. excel 粘贴了HTML怎么删掉,Excel怎么删除网页上复制删不掉的文本框
  4. typedef struct 用法
  5. promise的理解和应用
  6. python获取url响应
  7. 基于iOS用CoreImage实现人脸识别
  8. [pytorch] 深度学习分割网络U-net的pytorch模型实现 原创 2017年03月08日 21:48:21 标签: python / 深度学习 / 生物图
  9. Dennis Ritchie, father of Unix and C, dies
  10. iptables、firewalld和ufw区别linux
  11. 注册表如何管理右键菜单
  12. 重心法例题matlab,Excel重心法选址计算题的详细步骤
  13. win10定时锁定计算机,Win10自动锁屏时间太长了怎么设置?Win10设置自动锁屏时间的操作...
  14. Atitit 团队激励 理论与措施 目录 1. 马斯洛需求理论 1 2. 赫兹伯格双因素理论 1 3. X理论y理论 1 4. 期望理论。。 1 1.马斯洛需求理论 激励方法 福利 奖金
  15. 计算机表格出现value,excel表格出现#value解决方法
  16. android o bln-al10,bln-al10是什么手机型号 bln-al10是啥手机型号
  17. Encrypt加密解密
  18. 重磅:2019 前端开发者进阶指南.pdf
  19. 显示计算机名在桌面壁纸,Windows桌面壁纸自动显示计算机详细信息小工具–BgInfo...
  20. vim替换字符串带斜杠_VI中的查找和替换

热门文章

  1. [易飞]自定义会计报表从A帐套复制到B帐套
  2. java设置文本框里字体颜色_swing设置字体颜色
  3. 如何逐帧查看gif-利用Screen To Gif
  4. ffmpeg rtsp问题总结
  5. Google Analytics(分析)个人资格认证2018-2019-2020最新中英文题库
  6. Eclipse “cannot be resolved to a 。” error
  7. Windows这些自带应用一定不要删,否则会直接影响到电脑使用
  8. NodeJs卸载组件的方法
  9. 湖北三职没有计算机一级证,2021湖北省考报名:应届毕业生没发毕业证怎么填写毕业证编号...
  10. Nexus 搭建Maven私服(Linux)