--昨夜西风凋碧树,独上高楼,望尽天涯路
高效的监控和日志管理对保持生产系统持续稳定的运行以及排查问题至关重要。
-
Docker logs
Docker logs是Docker默认的日志功能。
对于一个运行的容器,Docker会将日志发送到容器的标准输出设备(STDOUT)和标准错误设备(STDERR),STDOUT和STDERR实际上就是容器的控制台终端。
通过docker logs 查看容器的log:
docker logs能够打印出自容器启动以来完整的日志,并且-f参数可以继续打印楚新产生的日志,效果和Linux命令tail -f一样。
-
Docker logging driver
Docker提供了多种日志机制(logging driver)来从容器中获取日志信息,将容器日志发送到STDOUT和STDERR
Docker的默认日志行为。
Docker的默认logging driver是json-file:
json-file会将容器的日志保存在json文件中,Docker负责格式化其内容并输出到STDOUT和STDERR。
我们可以在Host的容器目录中找到这个文件,容器路径为/var/lib/docker/containers/<contarier ID>/<contariner ID>-json.log。
-
ELK
ELK包含了Elasticsearch、Logstash、Kibana。
1.Elasticsearch
实时查询的全文搜索引擎。处理和搜索巨量的日志数据
2.Logstash
读取原始日志,并对其进行分析和过滤,然后将其转发给其他组件(比如Elasticsearch)进行索引或存储。Logstash支
丰富的Input和Output类型,能够处理各种应用的日志。
3.Kibana
基于JavaScript的Web图形界面程序,专门用于可视化ElasticSearch的数据。
日志处理流程:
Logstash负责从各个Docker容器中提取日志,并将日志转发到Elasticsearch进行索引和保存,Kinaba分析和可视化数据。
通过如下命令运行ELK(这种是打包成一体,最小方案运行ELK,如果生产环境,单个安装配置):
docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk
容器启动后ELK各组件将分别监听如下端口:
5601:Kibana web 接口
9200:Elasticsearch JSON接口
5044:Logstash 日志接收接口
这有个小插曲,启动的时候会报错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解决方案:修改/etc/下面的sysctl.conf文件:
访问Kibana:http://[Host IP]:5601/
当前Kibana没有数据,只是因为当前的Elasticsearch没有任何日志数据。
访问Elasticsearch的JSON接口:http://[Host IP]:9200/_search?pretty
4.安装Filebeat(注意和elk的版本匹配)
Docker会将容器日志记录到/var/lib/docker/containers/<container ID>/<container ID>-json.log,我们通过Filebeat发送该文件给ELK进行日志管理。
Filebeat能够将指定路径下的日志文件转发给ELK(进行监控,实时转发)。
执行如下命令:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.3.2-x86_64.rpm
首先在/etc/filebeat/下面修改配置:
这里我们只是简单演示,不通过logstash过滤,直接传送到elasticsearch:
现在Filebeat已经运行起来了,刷新http://192.168.46.116:9200/_search?pretty
Elasticsearch已经创建了日志的索引并保存下来了,下面我们在Kibana中配置一个index pattern,即告诉Kibana查询和分析Elasticsearch中哪些日志:
之后点击Discovery,可以看到容器和syslog日志信息: