背景

在收集服务端聊天消息日志时,用到了 Filebeat dissect 语法,而这个语法是 Filebeat 6.4 及之后的版本支持。服务端部分机器的 Filebeat 版本为 6.3

考虑到日志收集工作的普遍性,为了保持版本统一减少运维成本,特增加一种基于 Docker 实现的通用 Filebeat 日志收集方案。

目录结构

最佳实践

建议将 docker-compose 文件存放至 /apps/srv/filebeat_xxx 目录中。 如果有其他习惯用法,也可以放至其他地方,总的原则是尽量放到一个父目录,方便管理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
├── data (自动生成)
│   ├── meta.json
│   └── registry
├── docker-compose.yml (必须)
├── Filebeat.yml (必须)
├── inputs.d (必须)
│   ├── chat_history_20220111.yml (必须, 视业务情况而定)
│   ├── chat_history.yml.template (可选)
│   └── history (可选)
│       ├── chat_history_20211224.yml
│       ├── chat_history_20211225.yml
└── log (自动生成)

docker-compose 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: "2"
services:
  filebeat7:
    image: harbor.baijiayun.com/elk/filebeat_7.5.0:latest
    container_name: "Filebeat-chat"
    restart: always
    user: root
    volumes:
      # Filebeat 在容器中默认读取 /usr/share/Filebeat/Filebeat.yml
      - ./Filebeat.yml:/usr/share/Filebeat/Filebeat.yml
      # 具体的配置文件夹 类似 Nginx 的 conf.d
      - ./inputs.d:/usr/share/Filebeat/inputs.d
      # Filebeat 默认日志输出目录
      - ./log:/opt
      # registry 等核心数据
      - ./data:/usr/share/Filebeat/data
      # ⭐️ 需要收集的业务日志目录,根据业务情况调整
      - /mydata:/mydata
      - /this/is/a/deep/path:/this/is/a/deep/path

最佳实践

在上述 docker-compose 中,前面部分映射的目录可以保持不变,最后需要收集的业务日志根据业务情况调整。请注意,最后需要收集的业务日志, 尽量映射到相同的位置,如 /this/is/a/deep/path 映射到容器时也要保持该目录层级,方便后续问题排查。

配置文件

cat /apps/srv/filebeat_chat/inputs.d/chat_history_20220111.yml 本案例中的配置文件由模版产生

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
- enabled: true
  type: log
  ignore_older: 24h
  fields_under_root: true
  json.add_error_key: true
  json.keys_under_root: true
  paths:
    - /mydata/chatHistory/20220111/*.txt
  tail_files: false
  fields:
    special_env: "latest"
    logtype: "chat-message"
  processors:
    - dissect:
        tokenizer: "/mydata/chatHistory/%{date}/%{rnum}.txt"
        field: "log.file.path"
        target_prefix: ""

模版文件(optional)

聊天消息日志文件较多,如果全盘招收,会占用较大的 CPU、内存资源。

聊天消息每天都会更新,根据这个特性,我们使用了模版文件,每天通过定时任务从模版中生成新的配置文件,并将历史的配置文件移出 inputs.d 目录。

模版文件如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
- enabled: true
  type: log
  ignore_older: 24h
  fields_under_root: true
  json.add_error_key: true
  json.keys_under_root: true
  paths:
    - /mydata/chatHistory/{DATE}/*.txt
  tail_files: false
  fields:
    special_env: "latest"
    logtype: "chat-message"
  processors:
    - dissect:
        tokenizer: "/mydata/chatHistory/%{date}/%{rnum}.txt"
        field: "log.file.path"
        target_prefix: ""

定时任务(optional)

cat /apps/scripts/generate_chat_filebeat_config.sh

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

#生成新文件
today=$(date +"%Y%m%d")
yesterday=$(date -d "yesterday" +"%Y%m%d")

cd /apps/srv/filebeat_chat/inputs.d
#看当日的聊天配置文件是否已经存在
#test -f  "user_report_$today.yml" || cat user_report.yml.template | sed "s/{DATE}/$today/" > user_report_$today.yml
test -f "chat_history_$today.yml" || cat chat_history.yml.template | sed "s/{DATE}/$today/" > chat_history_$today.yml

#移除昨天的
#test -f  user_report_$yesterday.yml && mv user_report_$yesterday.yml ./history/
test -f chat_history_$yesterday.yml && mv chat_history_$yesterday.yml ./history/

配置定时任务规则

1
15 0 * * * sh /apps/scripts/generate_chat_filebeat_config.sh &>> /tmp/generate_chat_filebeat_config.log