在收集服务端聊天消息日志时,用到了 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
|