使用ELK(ES+Logstash+Filebeat+Kibana)收集nginx的日志

文章目录

  • Nginx日志格式修改
  • 配置logstash收集nginx日志
  • 引入Redis
    • 收集日志写入redis
    • 从redis中读取日志
  • 引入Filebeat
    • Filebeat简介
    • Filebeat安装和配置
  • 配置nginx转发ES和kibana
  • ELK设置账号和密码

书接上回:《ELK中Logstash的基本配置和用法》

Nginx日志格式修改

默认情况下,Nginx的日志记录的是下面的格式:

127.0.0.1 - - [21/Aug/2023:10:55:30 +0800] "POST /url/index HTTP/1.1" 200 39801 "http://test.cc/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"

nginx.conf 中也可以看到相关配置信息:

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';

现在为了方便收集日志,我们把这里的格式改为 json格式,在 nginx.conf 中加入下面的内容:

log_format json '{"@timestamp": "$time_iso8601", ''"remote_addr": "$remote_addr", ''"remote_user": "$remote_user", ''"body_bytes_sent": "$body_bytes_sent", ''"request_time": "$request_time", ''"status": "$status", ''"request_uri": "$request_uri", ''"request_method": "$request_method", ''"http_referrer": "$http_referer", ''"http_x_forwarded_for": "$http_x_forwarded_for", ''"http_user_agent": "$http_user_agent"}';access_log  logs/access.log  json;

在这里插入图片描述

以上配置是手动组装了一个json格式的配置信息。相关字段说明如下:

  • $time_iso8601:格式化时间格式
  • $remote_addr #记录访问网站的客户端ip地址
  • $remote_port # 客户端的port
  • $remote_user # 如果nginx有配置认证,该变量代表客户端认证的用户名
  • $time_local #记录访问时间与时区
  • $request #用户的http请求起始行信息,包括方法名、请求地址、http版本
  • $status #http状态码,记录请求返回的状态码,例如:200、301、404等
  • $body_bytes_sent #服务器发送给客户端的响应body字节数
  • $http_referer #记录此次请求是从哪个连接访问过来的,可以根据该参数进行防盗链设置。
  • $http_user_agent #记录客户端访问信息,例如:浏览器、手机客户端等
  • $http_x_forwarded_for #当前端有代理服务器时,设置web节点记录客户端地址的配置,此参数生效的前提是代理服务器也要进行相关的x_forwarded_for设置
  • $request_body # post上传的数据
  • $request_time # 整个请求的总时间
  • $upstream_response_time # 请求过程中,和php-fpm的交互时间
  • $args # 请求中的参数,如www.123.com/1.php?a=1&b=2的 $args就是a=1&b=2
  • $content_length # HTTP请求信息里的”Content-Length”
  • $conten_type # HTTP请求信息里的”Content-Type”
  • $document_root # nginx虚拟主机配置文件中的root参数对应的值
  • $document_uri 或 $uri # 当前请求中不包含指令的URI,如www.123.com/1.php?a=1&b=2的
  • $document_uri就是1.php,不包含后面的参数
  • $request_uri # 请求的链接,包括和args
  • $host # 主机头,也就是域名
  • $http_cookie # 客户端的cookie信息
  • $request_body_file # 做反向代理时发给后端服务器的本地资源的名称
  • $request_method # 请求资源的方式,GET/PUT/DELETE等
  • $request_filename # 当前请求的资源文件的路径名称,相当于是document_uri的组合
  • $scheme # 请求的协议,如ftp,http,https
  • $server_protocol # 客户端请求资源使用的协议的版本,如HTTP/1.0,HTTP/1.1,HTTP/2.0等
  • $server_addr # 服务器IP地址
  • $server_name # 服务器的主机名
  • $server_port # 服务器的端口号

记得把 相关log 的后面的main改成json,还有需要修改的虚拟主机的log。

修改后记录的log格式如下:

{"@timestamp": "2023-08-21T11:24:00+08:00", "remote_addr": "127.0.0.1", "remote_user": "-", "body_bytes_sent": "11277", "request_time": "5.926", "status": "200", "request_uri": "/url/index", "request_method": "POST", "http_referrer": "http://test.cc/", "http_x_forwarded_for": "-", "http_user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36"}

配置logstash收集nginx日志

写入文件 logstash/config/logstash-to-es.conf:

input {file {path => ["/home/rx/mywebsite.log"]type => "mywebsite"tags => ["mywebsite","prod"]start_position => "beginning"}
}filter {json {source => "message"}
}output {elasticsearch {hosts => ["http://localhost:9200"]index => "mywebsite-prod-log-%{+YYYY.MM.dd}"user => "elastic"password => "mypassword"}
}

然后启动logstash即可开始收集:

./bin/logstash -r -f ./config/logstash-to-es.conf

引入Redis

如果服务器比较多,写入的日志落在不同的机器上,那么可以使用redis或者kafka作为中间件,收集多台机器的日志进行汇总处理。处理顺序:logstash收集日志 -> redis/kafka -> logstash过滤日志 -> ES ->kibana。流程图如下:
在这里插入图片描述

由于我在测试的过程中没有设置redis的密码,导致运行logstash失败
在这里插入图片描述
因此这里给redis设置一个密码:

redis-cli 
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379> config set requirepass 123456
OK
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"

收集日志写入redis

添加配置文件vim logstash-7.1.0/config/my_config/logstash-to-redis.conf,内容如下:

input {file {path => ["/var/log/syslog"]type => "system"tags => ["syslog","test"]start_position => "beginning"}file {path => ["/var/log/auth.log"]type => "system"tags => ["auth","test"]start_position => "beginning"}
}filter {}output {redis {host => ["127.0.0.1:6379"]password => "123456"db => "5"data_type => "list"key => "logstash"}
}

上面redis部分的配置,host是个数组,可以配置多个redis服务;db表示redis的第几个数据库;data_type这里用list类型模拟消息队列;key表示将来存储的redis数据的key的名称。

然后启动logstash,指定上面的配置信息:./bin/logstash -f ./config/my_config/logstash-to-redis.conf
然后打开redis客户端看看是否有数据:
在这里插入图片描述
可以看到redis中的消息队列已经存储了很多数据,接下来消费它。

从redis中读取日志

在logstash的配置文件中添加配置文件 vim logstash-7.1.0/config/my_config/logstash-from-redis.conf,内容如下:

input {redis {host => "127.0.0.1"port => 6379password => "123456"db => "5"data_type => "list"key => "logstash"}
}filter {}output {if [type] == "system" {if [tags][0] == "syslog" {elasticsearch {hosts  => ["http://127.0.0.1:9200"]index  => "logstash-system-syslog-%{+YYYY.MM.dd}"}stdout { codec=> rubydebug }}else if [tags][0] == "auth" {elasticsearch {hosts  => ["http://127.0.0.1:9200"]index  => "logstash-system-auth-%{+YYYY.MM.dd}"}stdout { codec=> rubydebug }}}
}

然后启动logstash,指定上面的配置信息:./bin/logstash -f ./config/my_config/logstash-from-redis.conf
启动后就开始消费redis里面的数据并写入ES中。
在这里插入图片描述

引入Filebeat

Filebeat简介

  • Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置,收集日志事件,并将它们转发到Elasticsearch或 Logstash进行索引。
  • Filebeat的工作方式如下:启动Filebeat时,它将启动一个或多个输入,这些输入将在为日志数据指定的位置中查找。对于Filebeat所找到的每个日志,Filebeat都会启动收集器。每个收集器都读取单个日志以获取新内容,并将新日志数据发送到libbeat,libbeat将聚集事件,并将聚集的数据发送到为Filebeat配置的输出。
  • logstash如果收集大量日志的时候,会占用很大的内存,使用Filebeat可以缓解这种情况。
    在这里插入图片描述
    Filebeat支持输出到多种存储介质:
    在这里插入图片描述
    引入Filebeat后的流程图如下:
    在这里插入图片描述

Filebeat安装和配置

在 这里 下载(我这里下载的5.6.9版本的,不同版本的配置文件不同),然后解压,可以根据需要修改配置文件filebeat.yml。更多内容参考:这里。

修改 filebeat 的配置文件,从nginx日志文件中读取内容,然后输出到redis:vim filebeat-5.6.9/filebeat.yml,内容如下:

filebeat.inputs:
- type: logpaths:- /usr/local/nginx/logs/access.log# tags: ["access"]fields:app: wwwtype: nginx-accessfields_under_root: true- type: logpaths:- /usr/local/nginx/logs/error.log# ags: ["error"]fields:app: wwwtype: nginx-errorfields_under_root: trueoutput.redis:hosts: ["192.168.0.1"]port: 6379password: "123456"key: "filebeat"db: 5datatype: list

启动filebeat:nohup ./filebeat -e -c filebeat.yml -d "publish" &
然后查看redis里面已经有了nginx的日志数据。

然后再消费者机器上配置logstash消费redis中的数据,vim logstash-7.17.12/config/logstash-from-redis.conf,配置内容如下:

input {redis {host => "192.168.0.1"port => 6379password => "123456"db => "5"data_type => "list"key => "filebeat"}
}filter {json {source => "message"}
}output {elasticsearch {hosts => ["http://localhost:9200"]index => "mywebsite-prod-log-%{+YYYY.MM.dd}"user => "elastic"password => "mypassword"}
}

配置nginx转发ES和kibana

如果需要使用80端口访问ES或kibana页面,可以在nginx中配置代理转发9200或5601端口,配置如下:

server {listen  80;server_name     es.xxxx.com;location / {proxy_pass      http://127.0.0.1:9200;}
}server {listen  80;server_name     kibana.xxxx.com;location / {proxy_pass      http://127.0.0.1:5601;}
}

上面配置后就可以直接通过域名来访问kibana的页面(需要添加hosts)。

ELK设置账号和密码

修改ES的配置文件vi config/elasticsearch.yml 添加如下内容

http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

保存后重启ES,然后执行:./bin/elasticsearch-setup-passwords interactive,需要设置以下六种账户的密码elastic、apm_system、kibana、logstash_system、beats_system、remote_monitoring_user
输入y开始设置,六种密码设置完成后,需要再次重启ES。
在这里插入图片描述
然后打开ES的页面,账号:elastic,密码就是你刚才设置的密码。
在这里插入图片描述
设置kibana的密码,vi config/kibana.yml,添加:

elasticsearch.username: "elastic"
elasticsearch.password: "你在es中设置的密码"

然后重新启动kibana,再次访问,需要输入账号和密码。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/111125.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gorilla LLM:连接海量 API 的大型语言模型

如果你对这篇文章感兴趣,而且你想要了解更多关于AI领域的实战技巧,可以关注「技术狂潮AI」公众号。在这里,你可以看到最新最热的AIGC领域的干货文章和案例实战教程。 一、前言 在当今这个数字化时代,大型语言模型(LLM…

利用多种机器学习方法对爬取到的谷歌趋势某个关键词的每日搜索次数进行学习

大家好,我是带我去滑雪! 前一期利用python爬取了谷歌趋势某个关键词的每日搜索次数,本期利用爬取的数据进行多种机器学习方法进行学习,其中方法包括:随机森林、XGBOOST、决策树、支持向量机、神经网络、K邻近等方法&am…

聚类分析 | MATLAB实现基于DBSCAD密度聚类算法可视化

聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化 目录 聚类分析 | MATLAB实现基于LP拉普拉斯映射的聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于DBSCAD密度聚类算法可视化,MATLAB程序。 使用带有KD树加速的dbscan_with_kdtree函数进行…

uniapp项目实战系列(1):导入数据库,启动后端服务,开启代码托管

目录 前言前期准备1.数据库的导入2.运行后端服务2.1数据库的后端配置2.2后端服务下载依赖,第三方库2.3启动后端服务 3.开启gitcode代码托管 ✨ 原创不易,还希望各位大佬支持一下! 👍 点赞,你的认可是我创作的动力&…

vscode编译C语言

首先把c文件拖到vscode中 然后安装这个插件 安装完毕后会提示你代码中的语法错误,并在编译器的右上角出现编译按钮 我当前的问题是没有GCC,我们点一下编译的按钮也可以看出来这个问题 在 django笔记中 附录二 windows上直接安装uwsgi(不可行) 附录二 win…

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中,切片(Slice)是一种强大且灵活的数据结构,用于管理和操作一系列元素。与数组相比,切片的大小可以动态调整,这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入,介…

243:vue+Openlayers 更改鼠标滚轮缩放地图大小,每次缩放小一点

第243个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中设置鼠标滚轮缩放地图大小,每次滑动一格滚轮,设定的值非默认值1。具体的设置方法,参考源代码。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源…

科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知

原创 | 文 BFT机器人 近日,四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地(平台)和人才计划。 01 自然科学基金项目 实施周期 …

全景图像生成算法

摘要 全景图像生成是计算机视觉领域的一个重要研究方向。本文对五种经典的全景图像生成算法进行综述,包括基于相机运动估计的算法、基于特征匹配的算法、基于图像切割的算法、基于多项式拟合的算法和基于深度学习的算法。通过对这些算法的原理、优缺点、适用场景等…

68、使用aws官方的demo和配置aws服务,进行视频流上传播放

基本思想:参考官方视频,进行了配置aws,测试了视频推流,rtsp和mp4格式的视频貌似有问题,待调研和解决 第一步:1) 进入aws的网站,然后进入ioT Core 2)先配置 Thing types & Thing,选择香港的节点,然后AWS ioT--->Manage---> Thing type 然后输入名字,创建Th…

C语言_分支和循环语句(2)

文章目录 前言一、for 循环1.1语法1.2 for 语句的循环控制变量1.3 一些 for 循环的变种 二、do ... while()循环2.1 do 语句的语法2.2 do ... while 循环中的 break 和 continue2.3 练习1 **- 计算n的阶乘**2. - **在一个有序数组中查找具体的某个数字 n** 二分查找算法&#x…

基于社交网络算法优化的BP神经网络(预测应用) - 附代码

基于社交网络算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于社交网络算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.社交网络优化BP神经网络2.1 BP神经网络参数设置2.2 社交网络算法应用 4.测试结果:5…

Java【手撕双指针】LeetCode 18. “四数之和“, 图文详解思路分析 + 代码

文章目录 前言一、四数之和1, 题目2, 思路分析3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 📗 Java数据结构: 顺序表, 链表, 堆…

Docker--harbor私有仓库部署与管理

目录 1、搭建本地私有仓库 #首先下载 registry 镜像 #在 daemon.json 文件中添加私有镜像仓库地址 #运行 registry 容器 #为镜像打标签 #上传到私有仓库 #列出私有仓库的所有镜像 ​ #列出私有仓库的 centos 镜像有哪些tag ​ #先删除原有的 centos 的镜像,再测试…

什么是响应式图片?如何在网页中实现响应式图片?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式图片&#xff08;Responsive Images&#xff09;⭐ 实现响应式图片的方法1. 使用<img>标签的srcset属性2. 使用<picture>元素3. 使用CSS的max-width属性4. 使用响应式图片库 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…

4.RabbitMQ高级特性 幂等 可靠消息 等等

一、如何保证生产者生产消息100%的投递成功 保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点&#xff08;Broker&#xff09;确认应答完善的消息进行补偿机制 1. 理解Confirm确认消息机制 消息的确认&#xff0c;是指生产者投递消息后&#xff0c;如果Broker收到消…

自然语言处理2-NLP

目录 自然语言处理2-NLP 如何把词转换为向量 如何让向量具有语义信息 在CBOW中 在Skip-gram中 skip-gram比CBOW效果更好 CBOW和Skip-gram的算法实现 Skip-gram的理想实现 Skip-gram的实际实现 自然语言处理2-NLP 在自然语言处理任务中&#xff0c;词向量&#xff08;…

Linux知识点 -- 网络基础(一)

Linux知识点 – 网络基础&#xff08;一&#xff09; 文章目录 Linux知识点 -- 网络基础&#xff08;一&#xff09;一、网络发展二、协议1.OSI七层模型2.TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1.局域网中的两台主机通信流程2.跨网段的两台主机间…

Vue中使用vue-drag-resize实现窗体可拖拽和随意缩放大小

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_ruoyi本地调式_霸道流氓气质的博客-CSDN博客 在上面的基础上&#xff0c;实现弹窗窗体可移动以及随意缩放大小。 效果如下 注&#xff1a; 博客&am…

C语言——类型转换

数据有不同的类型&#xff0c;不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种&#xff1a; 自动转换(隐式转换)&#xff1a;遵循一定的规则&#xff0c;由编译系统自动完成强制类型转换&#xff1a;把表达式的运算结果强制转换成所需的数据类型 语法格…