随着Docker容器广泛应用,对大规模运行的容器集群来说,日志不能集中管理是一件很痛苦的事情。不能合理的收集,管理检索应用日志,在应用发生了故障的时候将无法很好的追溯问题发生的原因。

通常我们会将docker日志挂载到宿主机目录,但是查看时十分不方便。如果用flunted统一管理日志,可以方便做统一管理。基于Elasticsearch+Fluentd+Kibana,可以方便的搭建日志分析平台,通过Kibana面板,可以在浏览器上方便查看。

启动Fluentd

1
2
3
4
5
docker run -d \
-p 24224:24224 -p 24224:24224/udp \
-v /data/logs/fluented:/fluentd/log \
fluent/fluentd:v1.3

将log挂载在宿主机的/data/logs/fluented, 注意对应的权限

此时会在宿主机目录下生成data.<fluentd容器id>.log,所有收集到的日志文件将存储至此。

测试

启动一个测试容器,写入日志。这里我们使用nginx服务。

1
2
3
4
5
6
7
8
# docker run -d \ 
--log-driver fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag="nginx-test" \
--log-opt fluentd-async-connect \
--name nginx-test \
-p 8080:80 \
nginx
1
2
3
4
5
-log-driver: 配置log驱动
--log-opt: 配置log相关的参数

fluentd-address: fluentd服务地址
fluentd-async-connect:fluentd-docker异步设置,避免fluentd挂掉之后导致Docker容器也挂了

配置好之后访问nginx页面http://localhost:8080/,查看日志文件,我这次是data.b597c850ce7a3ce7d444766b9d2450540.log

1
tail -f data.b597c850ce7a3ce7d444766b9d2450540.log

每次刷新会出现日志。

1
nginx-test	{"container_id":"c7a79971103e4ca5f793ec83b7da1e98648e65765cd82a8c3c1a3f4f4e5584db","container_name":"/nginx-test","source":"stdout","log":"172.17.0.1 - - [20/Nov/2019:14:51:28 +0000] \"GET / HTTP/1.1\" 304 0 \"-\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:70.0) Gecko/20100101 Firefox/70.0\" \"-\""}

注意

  • 使用了fluentd之后,将无法使用docker logs 查看;

  • 在配置fluentd之前创建的容器日志不会写入到Fluentd,如果想要存储进去需要重建容器;

  • 全局配置fluentd之后,如果fluentd服务异常,将无法启动容器;

    1
    Error response from daemon: Cannot restart container c7a79971103e: failed to initialize logging driver: dial tcp 127.0.0.1:24224: connect: connection refused

错误

[warn]: 'type' is deprecated parameter name. use '@type' instead.

提示配置文件错误

type forward配置项需要修改为@type forward

配置@type elasticsearch时错误,需要安装插件

1
config error file="/fluentd/etc/fluent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'elasticsearch'. Run 'gem search -rd fluent-plugin' to find plugins"

制作含fluent-plugin-elasticsearch插件的镜像

1
2
3
4
5
6
#编辑Dockerfile
FROM fluent/fluentd:v1.3.2-debian-1.0
RUN ["gem", "install", "fluent-plugin-elasticsearch"]

#docker build
docker build . -t fluentd:1.3.2

参考文档https://github.com/uken/fluent-plugin-elasticsearch

参考文档

https://www.fluentd.org/guides/recipes/docker-logging

安装文档:https://docs.fluentd.org/v1.0/articles/quickstart#step-1:-installing-fluentd

Docker配置Fluentd:https://docs.docker.com/config/containers/logging/fluentd/

fluent plugin elasticsearch: https://github.com/uken/fluent-plugin-elasticsearch