本文是《提升你的 Python 项目代码健壮性和性能》系列的第五篇文章。
讲的是日志系统 ELKFA 的搭建
什么是 ELKFA?
这五个字母分别代表着五个开源软件
利用这五个软件的组合,我们可以在比较短的时间打造两个系统:
Nginx 众所周知,Nginx 日志是个宝库,所以本文选取了 Nginx 作为日志分析的案例。
对于 Nginx 日志,可以采用 FileBeat 上传到 Logstash, 由 Logstash 对文件进行解析,并存储到 ElasticSearch
然后从 Kibana 进行分析。
首先,让 Nginx 的配置输出的日志符合某种模式,方便软件进行解析。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
然后重启 nginx
一天后,从 Nginx 服务器上拉一下 access.log 放到
elastic-labs/logs/prod/nginx 下
git clone git@github.com:twocucao/elastic-labs.git
cd elastic-labs
docker-compose up
啥、? 不会搭 Docker? 见文末
啥、? 不知道 ElasticSearch 怎么用、? 见文末
如果运行正常,终端应该是这样的
打开 kibana 进行观察
默认情况下,每一天的 Nginx 日志会在 ES 里创建一个 Index, 所以,你需要用 Index Pattern 来进行统计
来看看我们可以得到哪些内容
对于第六点,有些人可能有些疑惑,这也能?
当然咯,假设用户在搜索引擎里面,先搜索了『美女』, 然后搜索了『雪白』, 然后又搜索了『白-洁』, 那基本上这个人搜索的三个词就具备一定的关联性,想搜索的这个雪白就不是『雪白』的意思 > 而是你懂的。
上面四个步骤是为了解决分析 Nginx 日志的问题
一条日志从打印出来,到能在 Kibana 进行分析,需要经过如下的步骤:
如果你想要自定义日志获得更加完美的解决方案,那就需要对这几个流程进行进行细化。
比如你想通过 Flask 的日志来达到更好的用户操作定位。这就需要读者自行依照自己的理解来 hack 了
同任务一的启动方式
pip3 install poetry # 比 pip / pipenv 更好的依赖管理和构建工具
poetry install -vvv
poetry shell
flask run
写一个简单的管理和依赖工具
from flask import Flask
from elasticapm.contrib.flask import ElasticAPM
app = Flask(__name__)
app.config["ELASTIC_APM"] = {
"SERVICE_NAME": "dev-flask",
'SECRET_TOKEN': '',
}
apm = ElasticAPM(app)
@app.route("/")
def hello():
return "Hello, World!"
@app.route("/home")
def home():
return "home!"
@app.route("/<int:num>")
def hello_num(num):
import random
if random.randint(1, 100) > 95:
raise Exception(f"num") # 有接近 1/5 的概率会故意抛出异常
return f"Hello, {num}!"
随手写一个脚本 20 分钟内持续不断的访问接口
SECONDS=0
while [[ SECONDS -lt 1200 ]] ; do
for (( i = 0; i < 20; i++ )); do
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i"
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
curl "http://localhost:5000/$i" &
done
done
20 分钟过去了,我们可以获知到什么呢?
先设置时间为最近 30 分钟
在这里可以看到接口的访问情况
先看 Metric 分析
这里可以看到接口的稳定性,服务器的基本负载,以及 Error 的出现频次。
再看 Error
看到这里简直泪目 这就是 ELK 版本的 Sentry 啊
Time Saving && 防脱发利器
从 App 被监控到能在 Kibana 进行分析,需要经过如下的步骤:
如果你想要自定义日志获得更加完美的解决方案,那就需要对这前两个流程进行进行细化。
比如公司用 Graphql 的接口,那么,在这种情况下,自带的 contrib 下的 flask 包的路由基本就是废掉的,你需要再 Hack 一下。
本来这篇文章打算写日志的最佳实践的,结果在查找资料的时候发现了一篇更好的文章
看完之后打消了这个念头,转而写如何使用 ELK 的系统落实这种日志分析系统
欢迎点赞 / 关注 /star 文明三连