微服務從程式碼到k8s部署應有盡有系列(十一、日誌收集)

語言: CN / TW / HK

我們用一個系列來講解從需求到上線、從程式碼到k8s部署、從日誌到監控等各個方面的微服務完整實踐。

整個專案使用了go-zero開發的微服務,基本包含了go-zero以及相關go-zero作者開發的一些中介軟體,所用到的技術棧基本是go-zero專案組的自研元件,基本是go-zero全家桶了。

實戰專案地址:https://github.com/Mikaelemmmm/go-zero-looklook

序言

在介紹之前,我先說一下整體思路,如果你的業務日誌量不是特別大恰好你又使用的是雲服務,那你直接使用雲服務日誌就可以了,比如阿里雲的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-stash

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

https://gitee.com/kevwan/go-zero

歡迎使用 go-zerostar 支援我們!

微信交流群

關注『微服務實踐』公眾號並點選 交流群 獲取社群群二維碼。