在各种系统中,最关键的部分莫过于日志了,各种各样的应用的日志,系统的日志,从而需要监控,在查看容器的日志的时候,最常的命令应该就是docker logs cointainerid来查看日志了。
docker logs命令介绍
docker info可以查看日志记录的驱动程序,如下所示,使用的驱动为json文件。
日志路径如下:
docker logs主要就是读取容器控制台的错误输出和正常输出,这些日志也就是存放在json文件中,也就是说是,无论容器是running状态还是其他的状态,都是可以读取的。
当应用程序的输出不是在控制台的时候,那么在使用docker logs是看不到日志的,另外当容器运行很久之后,这个日志可能很大,从而可以使用重定向写入到文件中保存,如下帮助文件:
-f的主要作用表示和linux上的top是一样的,用来持续的输出日志文件。
-t 可以使用时间进行过滤。
使用ELK收集日志
在使用ELK来收集各个主机的日志的时候,主要就是使用filebeat来监控和收集日志,然后发送给es,然后在kibana中显示。
1、 安装filebeat
filebeat服务主要用来设置监控哪些日志,将日志发送到哪里进行存储。配置文件路径为/etc/filebeat/filebeat.yml。
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.3-x86_64.rpm
sudo rpm -vi filebeat-6.1.3-x86_64.rpm
修改配置文件如下所示(主要启用日志监控功能,设置需要监控的日志路径):
设置日志发送给elasticsearch(如果不在本主机上,那么就写上远程主机的ip和端口):
启动服务,需要查看日志检查服务是否正常启动(配置文件为yaml格式的文件,修改错误的话会导致服务无法启动):
2、 安装ELK容器
ELK容器官方有镜像,从而可以直接进行运行。
5601端口主要是kibana的web访问接口,而9200主要是elasticsearch的json端口,用来接收日志信息,和上面的filebeat的端口相对应。
访问9200端口,在没有接受到日志的时候,显示如下(http://192.168.1.222:9200/_search?pretty):
在新启动一个容器之后,那么就会收到日志信息,如下:
访问kibana,进行配置(http://192.168.1.222:5601):
点击创建index,然后显示如下:
多主机的时候,可以根据主机名来搜索日志:
3、 可能出现的问题
无法启动elk容器:报错如下:
elasticsearch max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
主要原因是因为内核参数设置问题,在测试的时候,可能因为虚拟机的内存过小,而ELK属于重量级的产品,所以将vm的内存可以设置为4G,然后再修改内核参数如下:
在kibana上显示无数据,如下:
主要检查时区的设置,当时间不一致的时候,是不能够正确显示日志信息的。
一键运行脚本
主要是用来直接执行安装容器,设置相关参数,不过kibana的配置还是需要手动进行配置。
[root@docker2 ~]# cat collectlog.sh
#!/usr/bin/bash
#run the elk containser's host ip
IP=192.168.1.222
#install filebeat
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.1.3-x86_64.rpm
sudo rpm -vi filebeat-6.1.3-x86_64.rpm
sed -i 's/ enabled: false/ enabled: true/' /etc/filebeat/filebeat.yml
sed -i "s/localhost/$IP/" /etc/filebeat/filebeat.yml
systemctl start filebeat.service
ps -ef|grep filebeat |grep -v grep
if [ $? == 0 ];then
echo "filebeat service is OK"
else
echo "filebeat service is fail,check var/log/messages"
fi
#change the kernel settings
sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144">> /etc/sysctl.d/99-sysctl.conf
#start elk container
docker run -p 5601:5601 -p 9200:9200 -itd --name elk kellyseeme/elk
netstat -ntlp |grep 9200 &>/dev/null && echo "elk container is running" || echo "must restart elk"