背景
随着单应用的拆分,微服务数量逐渐增长。不可避免的对运维工作产生爆发式的增长,而日志作为日常运维工作中必不可少的环节。由于微服务分布式部署造成日志分散,日志查询较为繁琐,故引出此需求。
需求
收集各个微服务中产生的日志,并将其通过可视化页面进行展示。
项目分解
一期工程
- 日志的集中收集工作
- 日志可视化搜索
- 制定简单日志规范,可按照应用+traceID+业务+日志内容(可能还会包含其他基础数据,以具体设计方案为准)
- traceId单应用单实例内日志追踪ID
- 日志内容暂不拆分具体业务类型下的日志格式
方案
- 每个微服务中增加向kafka推送日志模块,具体通过扩展logback的Appender进行实现,通过MDC增加traceID以及一些其他信息。
- logstash读取kafka数据,过滤信息推送ES。
日志规范设计
基于JSON文本
当前为V1.0字段定义格式
字段名称 | 字段类型 | 说明 |
---|---|---|
version | String | 版本号 |
app_id | String | 应用ID 由日志配置系统分配 |
service_name | String | 服务名称 |
send_time | Date | 日志写出时间 格式:yyyy-MM-dd HH:mm:ss,SSS |
hostname | String | 主机名称 |
trace_id | String | 日志追踪ID |
bus_type | String | 业务类型 |
bus_version | String | 业务类型版本号 |
payload | String | 日志内容 |
ELK安装
版本:7.9.3
ES docker安装
- 搜索仓库镜像
docker pull elasticsearch:7.9.3
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.9.3
- 一些指令
查看当前所有index
GET /_cat/indices?v
创建索引
创建一个名称为customer的索引,?pretty告诉服务响应一个美化的JSON
PUT /customer?pretty
创建一个索引数据
PUT /customer/doc/1?pretty
{
"name": "John Doe"
}
响应
{
"_index" : "customer",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
···
> 根据ID查询索引数据
```shell
PUT /customer/doc/1?pretty
响应
{
"_index" : "customer",
"_type" : "doc",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source" : { "name": "John Doe" }
}
删除索引
DELETE /customer?pretty
Kibana Docker安装
docker pull kibana:7.9.3
docker run --link YOUR_ELASTICSEARCH_CONTAINER_NAME_OR_ID:elasticsearch -p 5601:5601 docker.elastic.co/kibana/kibana:7.9.3
如果安装docker pull超时可以尝试如下方法
vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
重启docker
systemctl restart docker
logstash Docker安装
docker pull logstash:7.9.3
# 将pipeline配置文件放置于宿主机/home/xbz/bin/es/conf/pipeline/下
docker run --rm -it -v /home/xbz/bin/es/conf/pipeline/:/usr/share/logstash/pipeline/ logstash:7.9.3
测试监听kafka输出到标准输出
### 监听kafka输出至标准输出
input {
kafka {
bootstrap_servers => "192.168.100.101:9092"
topics => ["app-log"]
codec => "json"
group_id => "logstash_01"
}
}
output {
stdout {}
}
kafka数据推送ES
input {
kafka {
bootstrap_servers => "192.168.100.101:9092"
topics => ["app-log"]
codec => "json"
group_id => "logstash_02"
}
}
output{
elasticsearch{
hosts => ["192.168.100.101:9200"]
index => "app-log-%{app_id}-%{+YYYY.MM.dd}"
}
}