本文将介绍如何将 Python 项目的日志接入到 ELK(Elasticsearch、Logstash 和 Kibana)这一流行的日志管理平台。我们将详细讨论如何使用 Filebeat 进行日志收集,并通过 Logstash 解析 Python 日志,并将其存储在 Elasticsearch 中,最后使用 Kibana 进行可视化展示。
简介
ELK 是一个开源的日志管理平台,它可以帮助开发人员更好地监控和管理应用程序的日志。ELK 由三个组件组成:Elasticsearch、Logstash 和 Kibana。
Elasticsearch 是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。它是一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎,使用 Java 语言编写。
Logstash 是一个具有实时渠道能力的数据收集引擎,主要用于日志的收集与解析,并将其存入 ElasticSearch 中。
Kibana 是一款基于 Apache 开源协议,使用 JavaScript 语言编写,为 Elasticsearch 提供分析和可视化的 Web 平台。它可以在 Elasticsearch 的索引中查找,交互数据,并生成各种维度的表图。
Filebeat 是一个轻量级的数据传送工具,主要用于转发和集中日志数据。它是 ELK(Elasticsearch、Logstash、Kibana)日志系统中的一个组件,尤其擅长于收集和转发日志事件。Filebeat 监视您指定的日志文件或位置,收集日志事件,并将它们转发到 Elasticsearch 或 Logstash 进行索引。引入 Filebeat 作为日志搜集器,主要是为了解决 Logstash 开销大的问题。相比 Logstash,Filebeat 所占系统的 CPU 和内存几乎可以忽略不计。
常规 ELK 架构

引入 Filebeat

安装 ELK
在 Docker 上搭建 ELK+Filebeat 日志中心
启动 ElasticSearch
可直接 docker run 模式启动,或使用docker-compose 模式
docker run -d -p 9200:9200 --name elasticsearch elasticsearch
启动 Logstash
可直接 docker run 模式启动,或使用docker-compose 模式,logstash 中可以自行创建 es 的 index 以及编写日志内容解析的 grok 语句
1. 新建配置文件logstash.conf
input {
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
#填写实际情况elasticsearch的访问IP,因为是跨容器间的访问,使用内网、公网IP,不要填写127.0.0.1|localhost
hosts => ["{$ELASTIC_IP}:9200"]
}
}
# 2.启动容器,暴露并映射端口,挂载配置文件
docker run -d --expose 5044 -p 5044:5044 --name logstash -v "$PWD":/config-dir logstash -f /config-dir/logstash.conf
启动 Filebeat
可直接 filebeat 文件 模式启动,或使用docker-compose 模式
# 1.下载Filebeat压缩包
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.2.2-linux-x86_64.tar.gz
# 2.解压文件
tar -xvf filebeat-5.2.2-linux-x86_64.tar.gz
# 3.新建配置文件filebeat.yml
filebeat:
prospectors:
- paths:
- /tmp/test.log #日志文件地址
input_type: log #从文件中读取
tail_files: true #以文件末尾开始读取数据
output:
logstash:
hosts: ["{$LOGSTASH_IP}:5044"] #填写logstash的访问IP
# 4.运行filebeat
./filebeat-5.2.2-linux-x86_64/filebeat -e -c filebeat.yml
启动 Kibana
可直接 docker run 模式启动,或使用docker-compose 模式
docker run -d --name kibana -e ELASTICSEARCH_URL=http://{$ELASTIC_IP}:9200 -p 5601:5601 kibana
测试
模拟日志数据
# 1.创建日志文件
touch /tmp/test.log
# 2.向日志文件中写入一条nginx访问日志
echo '127.0.0.1 - - [13/Mar/2017:22:57:14 +0800] "GET / HTTP/1.1" 200 3700 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" "-"' >> /tmp/test.log
访问 http://{$KIBANA_IP}:5601


生产环境中部署时,还需使用数据卷进行数据持久化,容器内存问题也需考虑,elasticsearch 与 logstash 都是相对吃内存的,如果不加以限制,很可能会拖垮你整个服务器。
Python 日志接入 ELK
python 日志接入 ELK,主要问题是日志的格式解析,日常我们的 python 项目日志都是存储在 logs 目录下,根据 Python 程序的配置,分散到各个.log 文件。在程序部署使用 docker 或者 k8s 时,均可以通过挂载的方式,挂载到某一台宿主机上。我们的 Filebeat 可以配置读取相应的日志文件。再通过 Logstash 内配置内容解析,字段格式化等等操作,将非格式化的日志内容解析成结构化的数据,并详细解析不同的字段。
Filebeat 配置
filebeat:
prospectors:
-
paths:
- /home/***/logs/app.log #日志文件地址
input_type: log #从文件中读取
logstash 配置
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => "%{WORD:log_level}:%{DATA:log_message}" }
}
grok {
match => { "message" => "Request: %{TIMESTAMP_ISO8601:request_time} %{WORD:request_method} %{URIPATHPARAM:request_url}" }
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
#填写实际情况elasticsearch的访问IP,因为是跨容器间的访问,使用内网、公网IP,不要填写127.0.0.1|localhost
hosts => ["es_ip:9200"]
index => "python-pro-%{+YYYY.MM.dd}" ## 自定义es的index
}
}
访问 Kibana:
打开浏览器,访问 Kibana 的 Web 界面(默认地址为http://localhost:5601)。在 Kibana 中,创建一个新的索引模式,选择刚刚配置的索引名称(例如”python-pro-“)。现在你可以在 Kibana 中查看和分析你的 Python 项目日志了

原文始发于微信公众号(有追求的开发者):如何将python项目日志接入到ELK?
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/257036.html