咱们用一个系列来解说从需要到上线、从代码到k8s部署、从日志到监控等各个方面的微服务残缺实际。
整个我的项目应用了go-zero开发的微服务,根本蕴含了go-zero以及相干go-zero作者开发的一些中间件,所用到的技术栈根本是go-zero项目组的自研组件,根本是go-zero全家桶了。
实战我的项目地址:https://github.com/Mikaelemmm…
序言
在介绍之前,我先说一下整体思路,如果你的业务日志量不是特地大恰好你又应用的是云服务,那你间接应用云服务日志就能够了,比方阿里云的SLS,根本就是点点鼠标配置几步就能够将你的日志收集到阿里云的SLS外面了,间接就能够在阿里云中查看收集上来的日志了,感觉也没必要折腾。
如果你的日志量比拟大,那就能够上日志零碎了。
1、日志零碎
咱们将业务日志打印到console、file之后,市面上比拟罕用的形式是elk、efk等基本思路一样,咱们拿常说的elk来举例,基本思路就是logstash收集过滤到elasticsearch中,而后kibana出现
然而logstash自身是应用java开发的,占用资源是真滴高,咱们用go做业务,自身除了快就是占用资源少构建块,当初在搞个logstash浪费资源,那咱们应用go-stash代替logstash,go-stash是go-zero官网本人开发的并且在线上通过长期大量实际的,然而它不负责收集日志,只负责过滤收集上来信息。
go-stash: https://github.com/kevwan/go-…
2、架构计划
filebeat收集咱们的业务日志,而后将日志输入到kafka中作为缓冲,go-stash获取kafka中日志依据配置过滤字段,而后将过滤后的字段输入到elasticsearch中,最初由kibana负责出现日志
3、实现计划
在上一节错误处理中,咱们能够看到曾经将咱们想要的谬误日志打印到了console控制台中了,当初咱们只须要做后续收集即可
3.1 kafka
#音讯队列
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- 9092:9092
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
TZ: Asia/Shanghai
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- looklook_net
depends_on:
- zookeeper
先配置好kafka、zookeeper
而后咱们进入kafka中先创立好filebeat收集日志到kafka的topic
进入kafka容器
$ docker exec -it kafka /bin/sh
批改kafka监听配置(或者你把配置文件挂载到物理机在批改也能够)
$ vi /opt/kafka/config/server.properties
listeners=PLAINTEXT://kafka:9092 # 原文件中,要加kafka listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://kafka:9092 #源文件中,要加kafka advertised.listeners=PLAINTEXT://:9092
创立topic
$ cd /opt/kafka/bin
$ ./kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 -partitions 1 --topic looklook-log
3.2 filebeat
在我的项目根目录下 docker-compose-env.yml文件中能够看到咱们配置了filebeat
filebeat的配置咱们挂载到 deploy/filebeat/conf/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/lib/docker/containers/*/*-json.log
filebeat.config:
modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
processors:
- add_cloud_metadata: ~
- add_docker_metadata: ~
output.kafka:
enabled: true
hosts: ["kafka:9092"]
#要提前创立topic
topic: "looklook-log"
partition.hash:
reachable_only: true
compression: gzip
max_message_bytes: 1000000
required_acks: 1
配置比较简单,能够看到咱们收集所有日志间接 输入到咱们配置的kafka中 , topic配置上一步kafka中创立的topic即可
3.3 配置go-stash
咱们来看下go-stash的配置文件 deploy/go-stash/etc/config.yaml
Clusters:
- Input:
Kafka:
Name: gostash
Brokers:
- "kafka:9092"
Topics:
- looklook-log
Group: pro
Consumers: 16
Filters:
- Action: drop
Conditions:
- Key: k8s_container_name
Value: "-rpc"
Type: contains
- Key: level
Value: info
Type: match
Op: and
- Action: remove_field
Fields:
# - message
- _source
- _type
- _score
- _id
- "@version"
- topic
- index
- beat
- docker_container
- offset
- prospector
- source
- stream
- "@metadata"
- Action: transfer
Field: message
Target: data
Output:
ElasticSearch:
Hosts:
- "http://elasticsearch:9200"
Index: "looklook-{{yyyy-MM-dd}}"
配置生产的kafka以及输入的elasticsearch , 以及要过滤的字段等
3.4 elastic search、kibana
拜访kibana http://127.0.0.1:5601/ , 创立日志索引
点击左上角菜单(三个横线那个东东),找到Analytics – > 点击discover
而后在以后页面,Create index pattern->输出looklook-* -> Next Step ->抉择@timestamp->Create index pattern
而后点击左上角菜单,找到Analytics->点击discover ,稍等一会,日志都显示了 (如果不显示,就去排查filebeat、go-stash,应用docker logs -f filebeat查看)
咱们在代码中增加一个谬误日志尝试一下,代码如下
func (l *BusinessListLogic) BusinessList(req types.BusinessListReq) (*types.BusinessListResp, error) {
logx.Error("测试的日志")
...
}
咱们拜访这个业务办法,去kibana中搜寻 data.log : “测试”,如下图
4、结尾
到此日志收集就实现了,接下来咱们要实现链路追踪
我的项目地址
https://github.com/zeromicro/go-zero
欢送应用 go-zero
并 star 反对咱们!
微信交换群
关注『微服务实际』公众号并点击 交换群 获取社区群二维码。
发表回复