ELK简单介绍
在现代软件开发中,日志处理是至关重要的一环。Elasticsearch、Logstash 和 Kibana(ELK)组成了一套强大的日志管理解决方案,能够有效地收集、存储、分析和可视化大量日志数据。结合FastAPI,我们可以快速构建一个实时日志收集、展示和预警的系统。
Docker安装
在有些软件源中将默认不存在docker的社区版本。我们需要到Docker官方网站上面去添加他的镜像源。
Docker官方页面
大家可以根据自己的系统去针对性的添加系统版本
Docker配置Kibana和ES节点
ES节点创建
1.创建ELK网卡
docker network create elastic
2.拉取ES镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2
3.创建ES节点。此处注意-m 参数需要添加内存。否则ES可能因为内存过少无法启动或者报错
docker run --name es01 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.12.2
4.报错简单排障
在启动完成后。ES节点可能会出现ErrorCode 78 错误。此错误是因为Linux系统默认的内存映射大小不足。需要修改
sysctl -w vm.max_map_count=262144
上面的命令会修复这个78错误。但是只有这次系统启动状态有用。系统重启后。将会失效。如果需要写入到系统文件中/etc/sysctl.conf
5.密钥或者令牌获取 🎉节点启动不报错后将会在控制台中输出密钥和令牌。请及时保存
Kibana节点创建
1.拉取Kibana镜像
docker pull docker.elastic.co/kibana/kibana:8.12.2
2.启动Kibana
docker run --name kib01 --net elastic -p 5601:5601 docker.elastic.co/kibana/kibana:8.12.2
启动完成后。Kibana容器会提示一个url链接。将链接对应ip部分替换为宿主机ip。即可打开页面。初次使用需要进行初始化。即输出es输出的令牌和密码。
Fastapi配置进行日志存储
包安装
我们需要安装下面的两个包
pip install elasticsearch
pip install python-logstash-async
包安装完成后。我们需要建立一个Logstash的配置文件。下面是我配置文件。大家可以照抄
input {
tcp {
port => 5044
codec => json
}
}
output {
elasticsearch {
hosts => "http://192.168.0.150:9200"
user => "elastic"
password => "XHFLi5p0FNfnJ43NgYf*"
}
}
此外。在win上使用Logstash我们需要去官网下载对应的exe。然后输入命令去启动Logstash的服务。
.\logstash -f D:\FastApi_Blog\logstash.conf
注意。这个命令中在指向配置文件时需要写入绝对路径。可能是win包的bug。
Fastapi输出日志格式化
首先我们需要对我们的日志输出代码进行修改
from elasticsearch import Elasticsearch
from logstash_async.handler import AsynchronousLogstashHandler
@app.on_event("startup")
async def startup_event():
host = 'localhost'
port = 5044
# Get you a test logger
test_logger = logging.getLogger('python-logstash-logger')
# Set it to whatever level you want - default will be info
test_logger.setLevel(logging.DEBUG)
# Create a handler for it
async_handler = AsynchronousLogstashHandler(host, port, database_path=None)
# Add the handler to the logger
test_logger.addHandler(async_handler)
for i in range(1000):
test_logger.info("This is an info message at %s", time.time())
time.sleep(0.5)
我写了一个循环输出日志。随后我们需要启动对应的服务
1.Fastapi服务
uvicorn.exe main:app --reload
2.Logstash服务
.\logstash -f D:\FastApi_Blog\logstash.conf
💀 此处注意。在win上启动这个服务。必须将配置文件路径设置为绝对路径。要不然他找不到路径。 当你启动服务后。将会自动输入日志到kibana中。
ES和Kibana配置修改
在启动服务后。可能会在es日志或者logstash日志中发现无法连接的情况。因为现在的ES和kibana都是利用ssl进行传输。所以我们需要修改配置文件中的配置。 注意我们在测试环境可以这样操作,生产环境中请注意安全
1.进入ES容器。
root@b706a2feb1c4:/usr/share/elasticsearch/config# cat elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
#----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------
#
# The following settings, TLS certificates, and keys have been automatically
# generated to configure Elasticsearch security features on 07-03-2024 05:36:44
#
# --------------------------------------------------------------------------------
# Enable security features
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
# Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
xpack.security.http.ssl:
enabled: true
keystore.path: certs/http.p12
# Enable encryption and mutual authentication between cluster nodes
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
cluster.initial_master_nodes: ["b706a2feb1c4"]
#----------------------- END SECURITY AUTO CONFIGURATION -------------------------
修改配置文件中的
xpack.security.transport.ssl:
enabled: true
将enabled: true 为False。即可。保存重启容器
2.进入Kibana容器
root@2885082306ca:/usr/share/kibana/config# cat kibana.yml
### >>>>>>> BACKUP START: Kibana interactive setup (2024-03-07T05:45:12.771Z)
#
# ** THIS IS AN AUTO-GENERATED FILE **
#
# Default Kibana configuration for docker target
#server.host: "0.0.0.0"
#server.shutdownTimeout: "5s"
#elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#monitoring.ui.container.elasticsearch.enabled: true
### >>>>>>> BACKUP END: Kibana interactive setup (2024-03-07T05:45:12.771Z)
# This section was automatically generated during setup.
server.host: 0.0.0.0
server.shutdownTimeout: 5s
elasticsearch.hosts: ['https://172.18.0.2:9200']
monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3MDk3OTAzMTEwNjk6TDlaT0Q1aW1TQ2Ffa2pHai1SNFdGUQ
elasticsearch.ssl.certificateAuthorities: [/usr/share/kibana/data/ca_1709790312761.crt]
xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: ['https://172.18.0.2:9200'], ca_trusted_fingerprint: a27d5126fe87bccdef634ad35bf29f1980f98f170924179b760451dd7b817f5e}]
将容器中的https地址修改为http。即可随后重启容器
评论区