前言

简介

ELK(Elasticsearch、Logstash、Kibana)是开源的实时日志收集分析解决方案。

  • Elasticsearch:开源搜索引擎,是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。Elasticsearch为所有类型的数据提供近乎实时的搜索和分析。无论是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。在ELK中负责日志分析与存储。
  • Logstash:日志收集、过滤、转发的日志收集引擎。能够从多个来源采集数据,转换数据,然后将数据发送到“存储库”中。Logstash能够动态地采集、转换和传输数据,不受格式或复杂度的影响。在本文中负责接收处理filebeat的数据
  • Kibana:负责页面可视化展示。
  • Filebeat:日志数据采集

完整日志系统的基本特征:

  • 收集:能够采集多种来源的日志数据
  • 传输:能够稳定的把日志数据解析过滤并传输到存储系统
  • 存储:存储日志数据
  • 分析:支持UI分析
  • 警告:能够提供错误报告,监控机制

部署位置

IP 应用 版本 说明
192.168.2.249 elasticsearch 7.5.1 日志分析和存储,简称“es”
192.168.2.249 logstash 7.5.1 日志处理
192.168.2.249 kibana 7.5.1 数据可视化
192.168.2.249 filebeat 7.5.1 日志采集
192.168.2.249 nginx 1.21.5 日志源

步骤

准备工作

  1. 安装docker和docker-compose,可参考 博客园 - 花酒锄作田 - linux离线安装docker与compose
  2. docker拉取es、logstash和kibana的docker镜像(version 7.5.1)
  3. 下载filebeat的二进制程序压缩包(官方下载地址
  4. 安装nginx

记录的一些命令(使用普通用户admin,有docker的使用权限)

# 拉取镜像
docker pull elasticsearch:7.5.1
docker pull logstash:7.5.1
docker pull kibana:7.5.1 # 准备数据和配置文件目录
mkdir -p $HOME/apps/{elasticsearch,logstash,kibana}

安装elasticsearch

  1. 编辑es-compose.yaml
version: '3'
services:
elasticsearch:
image: elasticsearch:7.5.1
container_name: es
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
hostname: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
  1. 创建docker容器
docker-compose -f es-compose.yaml
  1. 从容器中复制一些配置
docker cp es:/usr/share/elasticsearch/data $HOME/apps/elasticsearch
docker cp es:/usr/share/elasticsearch/config $HOME/apps/elasticsearch
docker cp es:/usr/share/elasticsearch/modules $HOME/apps/elasticsearch
docker cp es:/usr/share/elasticsearch/plugins $HOME/apps/elasticsearch
  1. 修改es-compose.yaml(主要用于挂载数据持久化目录)
version: '3'
services:
elasticsearch:
image: elasticsearch:7.5.1
container_name: es
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m" ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- /home/admin/apps/elasticsearch/modules:/usr/share/elasticsearch/modules
- /home/admin/apps/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /home/admin/apps/elasticsearch/data:/usr/share/elasticsearch/data
- /home/admin/apps/elasticsearch/config:/usr/share/elasticsearch/config
hostname: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
  1. 重新启动
docker-compose -f es-compose.yaml up -d

安装logstash

  1. 编辑logstash-compose.yaml
version: '3'
services:
logstash:
image: logstash:7.5.1
container_name: logstash
hostname: logstash
ports:
- "5044:5044"
  1. 启动docker容器
docker-compose -f logstash-compose.yaml up -d
  1. 从docker容器中复制配置
docker cp logstash:/usr/share/logstash/config $HOME/apps/logstash
docker cp logstash:/usr/share/logstash/pipeline $HOME/apps/logstash
  1. 修改 $HOME/apps/logstash.config/logstash.yml,示例如下
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.2.249:9200" ]
  1. 修改$HOME/apps/logstash/pipeline/logstash.conf
input {
beats {
port => 5044
codec => "json"
}
} output {
elasticsearch {
hosts => ["http://192.168.2.249:9200"]
index => "logstash-nginx-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
  1. 修改logstash-compose.yaml
version: '3'
services:
logstash:
image: logstash:7.5.1
container_name: logstash
hostname: logstash
ports:
- "5044:5044"
volumes:
- /etc/localtime:/etc/locatime:ro
- /etc/timezone:/etc/timezone:ro
- /home/admin/apps/logstash/pipeline:/usr/share/logstash/pipeline
- /home/admin/apps/logstash/config:/usr/share/logstash/config
  1. 重新启动
docker-compose -f logstash-compose.yaml up -d

安装kibana

  1. 编辑kibana-compose.yaml
version: '3'
services:
kibana:
image: kibana:7.5.1
container_name: kibana
hostname: kibana
ports:
- "5601:5601"
  1. 启动
docker-compose -f kibana-compose.yaml up -d
  1. 从docker容器中复制配置
docker cp kibana:/usr/share/kibana/config $HOME/apps/kibana
  1. 修改 $HOME/apps/kibana/config/kibana.yml,修改es地址和指定中文
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.2.249:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
  1. 修改kibana-compose.yaml
version: '3'
services:
kibana:
image: kibana:7.5.1
container_name: kibana
hostname: kibana
ports:
- "5601:5601"
volumes:
- /etc/localtime:/etc/locatime:ro
- /etc/timezone:/etc/timezone:ro
- /home/admin/apps/kibana/config:/usr/share/kibana/config
  1. 重新启动
docker-compose -f kibana-compose.yaml up -d

修改nginx日志格式

log_format json '{"@timestamp": "$time_iso8601", '
'"connection": "$connection", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"request_method": "$request_method", '
'"request_uri": "$request_uri", '
'"server_protocol": "$server_protocol", '
'"status": "$status", '
'"body_bytes_sent": "$body_bytes_sent", '
'"http_referer": "$http_referer", '
'"http_user_agent": "$http_user_agent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"request_time": "$request_time"}';

在http块中设置:access_log logs/access.log json;

安装filebeat

  1. 假设filebeat的压缩包已下载并解压,解压和重命名之后,二进制文件所在目录为/home/admin/apps/filebeat
  2. 编辑filebeat.yaml,找到以下内容,取消输出到es,改为输出到logstash,示例:
#-------------------------- Elasticsearch output ------------------------------
#output.elasticsearch:
# Array of hosts to connect to.
#hosts: ["localhost:9200"] # Optional protocol and basic auth credentials.
#protocol: "https"
#username: "elastic"
#password: "changeme" #----------------------------- Logstash output --------------------------------
output.logstash:
# The Logstash hosts
hosts: ["192.168.2.249:5044"]
  1. 启用nginx模块
./filebeat modules enable nginx
  1. 配置nginx模块。修改./modules.d/nginx.yml,主要修改nginx日志的路径,示例如下
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/7.5/filebeat-module-nginx.html - module: nginx
# Access logs
access:
enabled: true # Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/home/admin/apps/nginx/logs/*access.log"] # Error logs
error:
enabled: true # Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
var.paths: ["/home/admin/apps/nginx/logs/*error.log"]
  1. 检查配置
./filebeat test config
./filebeat test output
  1. 验证通过后,启动
nohup ./filebeat -e -c ./filebeat.yml > /dev/null 2>&1 &

kibana展示

  1. 打开kibana的web页面,端口5061
  2. 打开左侧菜单栏的设置(management) - 索引模式 - 创建索引模式
  3. 输入logstash-nginx-*,点击下一步(如果点不了,选择timestamp)
  4. 打开左侧菜单栏的discover,选择logstash-nginx-*就可以试试查看nginx输出日志了

参考资料

部署ELK+filebeat收集nginx日志的更多相关文章

  1. ELK Stack (2) —— ELK + Redis收集Nginx日志

    ELK Stack (2) -- ELK + Redis收集Nginx日志 摘要 使用Elasticsearch.Logstash.Kibana与Redis(作为缓冲区)对Nginx日志进行收集 版本 ...

  2. Kubernetes实战之部署ELK Stack收集平台日志

    主要内容 1 ELK概念 2 K8S需要收集哪些日志 3 ELK Stack日志方案 4 容器中的日志怎么收集 5 K8S平台中应用日志收集 准备环境 一套正常运行的k8s集群,kubeadm安装部署 ...

  3. ELK日志系统之使用Rsyslog快速方便的收集Nginx日志

    常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...

  4. ELK整合Filebeat监控nginx日志

    ELK 日志分析 1. 为什么用到 ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep. awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如 ...

  5. ELK 二进制安装并收集nginx日志

    对于日志来说,最常见的需求就是收集.存储.查询.展示,开源社区正好有相对应的开源项目:logstash(收集).elasticsearch(存储+搜索).kibana(展示),我们将这三个组合起来的技 ...

  6. ELK学习实验018:filebeat收集docker日志

    Filebeat收集Docker日志 1 安装docker [root@node4 ~]# yum install -y yum-utils device-mapper-persistent-data ...

  7. ELK学习实验016:filebeat收集tomcat日志

    filebeat收集tomcat日志 1 安装tomcat [root@node4 ~]# yum -y install tomcat tomcat-webapps tomcat-admin-weba ...

  8. ELK filter过滤器来收集Nginx日志

    前面已经有ELK-Redis的安装,此处只讲在不改变日志格式的情况下收集Nginx日志. 1.Nginx端的日志格式设置如下: log_format access '$remote_addr - $r ...

  9. Docker 部署 elk + filebeat

    Docker 部署 elk + filebeat kibana 开源的分析与可视化平台logstash 日志收集工具 logstash-forwarder(原名lubmberjack)elastics ...

  10. ELK+FileBeat+Log4Net搭建日志系统

    ELK+FileBeat+Log4Net搭建日志系统 来源:https://www.zybuluo.com/muyanfeixiang/note/608470 标签(空格分隔): ELK Log4Ne ...

随机推荐

  1. 文心一言 VS chatgpt (1)-- 算法导论1.1

    1.给出现实生活中需要排序的一个例子或者现实生活中需要计算凸壳的一个例子. 文心一言: 现实生活中需要排序的一个例子: 在一个商店里,顾客需要购买一些商品.他们需要按照价格从低到高排序,以便更容易地找 ...

  2. 3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信

    原文链接:https://forum.laf.run/d/556 FastGPT 是一个超级的 ChatGPT 平台项目,功能非常强大: 集成了 ChatGPT.GPT4 和 Claude 可以使用任 ...

  3. 封装vue基于element的select多选时启用鼠标悬停折叠文字以tooltip显示具体所选值

    相信很多公司的前端开发人员都会选择使用vue+element-ui的形式来开发公司的管理后台系统,基于element-ui很丰富的组件生态,我们可以很快速的开发管理后台系统的页面(管理后台系统的页面也 ...

  4. 前端自动识别CAD图纸提取信息方法总结

    前言 CAD图纸自动识别和提取信息具有许多意义,包括以下几个方面: 提高工作效率:传统上,对于大量的CAD图纸,人工识别和提取信息是一项耗时且繁琐的任务.通过自动化这一过程,可以大大提高工作效率,节省 ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

    一.证明:假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳.则意味着我们知道应聘者排名的全部次序. 文心一言: 证明: 假设在过程 HIRE-ASSISTANT ...

  6. CHS、LAB地址

    CHS地址 CHS地址指的是柱面(Cylinder).磁头(Head).扇区(Sector)三个参数组成的地址,是用来表示磁盘上每个扇区位置的一种方式. 物理扇区号 = ((柱面号×磁头数) + 磁头 ...

  7. 读少写多的条件下 ConcurrentHashMap 和 ReadWriteLock 的选择

    场景是这样的:两个对象往一个 Map 里循环写入,另外一个对象偶尔读一次,写的频率比读的频率高很多.希望实现的是读的时候暂停写入.CocurrentHashMap 和 ReadWriteLock 各有 ...

  8. 【LeetCode】Find Pivot Index #724 Rust Solution

    给定一个整数类型的数组 nums,请编写一个能够返回数组 "中心索引" 的方法.我们是这样定义数组 中心索引 的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和.如果数 ...

  9. 【HMS Core】Health Kit健康数据采样, 原子采样数据问题

    [问题描述] 1.体脂数据中的肌肉量和水份量是如何获得的,都有些什么?体脂数据中的体重,体脂是用户自己上传的,然后通过计算公式得到数据吗 2.日常活动统计数据包含什么内容,怎么获取这些数据? 3. 锻 ...

  10. 一分钟学一个 Linux 命令 - ps

    前言 大家好,我是 god23bin.欢迎来到<一分钟学一个 Linux 命令>系列,每天只需一分钟,记住一个 Linux 命令不成问题.今天要说的是 ps 命令. 什么是 ps 命令? ...