前言
随着一个大项目的在服务器集群上的服务增多,每一个服务都会产生大量的日志信息。为了方便运维人员维护,就需要一个系统能集中管理所有服务的日志。为了能集中管理日志,就需将每个服务的日志收集起来,然后统一存入数据库。
本文简要介绍了使用 fluentd 收集 docker 日志,然后发送到接口里。
接口接收到数据可以存入mysql, oracle, mongo 等数据库。
一、fluentd是什么?
fluentd 是一个日志收集系统,通过丰富的插件,可以收集来自于各种系统或应用的日志,然后根据用户定义将日志做分类处理。
教程:1. 使用教程https://blog.csdn.net/easylife206/article/details/117433148?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-18.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-18.no_search_link
2. 安装和使用 https://blog.csdn.net/qq_27252133/article/details/53520416?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2.no_search_link
二、使用fluentd收集docker日志
1. 使用docker部署fluentd
-
拉取镜像
执行命令:docker pull fluentd
-
创建 fluent.conf 文件
执行命令:vim fluent.conf
<source>
@type forward
port 24224
bind 0.0.0.0
</source>
<match *>
@type copy
<store>
@type http
endpoint http://localhost:9090/
open_timeout 2
http_method post
<format>
@type json
</format>
<buffer>
flush_interval 3s
</buffer>
</store>
<store>
@type stdout
<format>
@type json
</format>
</store>
</match>
注意:endpoint 后面的 http://localhost:9090/ 替换成自己的接收数据的接口
- 部署fluentd
若你的fluent.conf 文件路径是 /root ,则部署命令为
docker run -it -d -p 24224:24224 --name=fluentd -v /root/fluent.conf:/fluentd/etc/fluent.conf fluentd
2. 收集docker日志
docker的log driver默认支持fluentd。
使用fluentd 收集 docker 日志有两种方式。
- 局部使用fluentd收集
-
启动docker容器时加上 –log-driver fluentd --log-opt fluentd-address=0.0.0.0:24224 --log-opt fluentd-async-connect
-
0.0.0.0:24224 是上一步启动的 fluentd 容器的地址
-
fluentd-async-connect 异步日志 这个表示 fluentd挂了,docker服务仍然照常
-
例:
docker run -itd --name=product_log2 -p 8888:8888 --log-driver fluentd --log-opt fluentd-address=0.0.0.0:24224 --log-opt fluentd-async-connect flask_test:v1
- 全局使用fluentd收集
- 修改 /etc/docker/daemon.json,然后重启 docker daemon 使配置生效。
{
"log-driver": "fluentd",
"log-opts": {
"fluentd-address": "0.0.0.0:24224"
}
}
- 检查/etc/sysconfig/docker中配置的log server 是否已经配置
3. 查看收集结果
docker logs fluentd
- 在日志接收的接口里查看 (上面例子是:
http://localhost:9090/
)
结果例子:
总结
- docker里log driver 发送的 log 信息
字段 | 描述 |
---|---|
container_id | 64 字符的 container id |
container_name | container 名字 |
source | stdout 或 stderr |
log | container 的 log |
- 关于JSON 的方式发送
- 如果使用 JSON 的方式发送,HTTP 请求的 content-type 为 application/x-ndjson (newline-delimited JSONs)。如果用 spring mvc 接收会提示不支持。可以使用HTTPServletRequest接收 request body。
- 关于python里json和ndJSON 互相转化可以参考:https://blog.csdn.net/weixin_44836662/article/details/120754960?spm=1001.2014.3001.5501