日志分析系统可以实时收集、分析、监控日志并报警,当然也可以非实时的分析日志。splunk是功能强大且用起来最省心的,但是要收费,免费版有每天500M的限制,超过500M的日志就没法处理了。ELK系统是最常见的,缺点是配置麻烦一些,比较重量级。graylog是开源免费的,配置上要比ELK系统简单。综上,本文尝试容器方式搭建一套graylog系统,不做实时收集日志和报警的配置,只完成非实时被动接收网站日志,分析日志各项指标的功能。
docker官方镜像国内速度我觉得慢,改成国内镜像。新建文件daemon.json如下
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
也可以用网易镜像http://hub-mirror.c.163.com
配置完重启docker才能生效
#service docker restart
拉取如下三个镜像
docker pull mongo:3
docker pull docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
docker pull graylog/graylog:3.3
不要急着按照网上的方法启动镜像,我开始docker启动elasticsearch,虽然显示启动成功,但过半分钟后偷偷退出,这导致graylog在浏览器打不开。最后通过查看容器启动时的日志,发现elasticsearch对于系统参数是有要求的,按如下修改。
在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144
vi /etc/security/limits.conf
* - nofile 102400
修改完成后重启系统使变量生效。
docker启动elasticsearch时要加上参数
--ulimit nofile=65536:65536 --ulimit nproc=4096:4096
,确保容器内环境满足要求,否则在docker pa -a命令下会看到exit(78)或exit(1)的容器异常退出错误。
查看容器启动报错最准确的方法是“docker logs -f 容器ID”这个命令,我们不加–ulimit 参数试试
[root@bogon ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e4a811093d9 docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10 "/usr/local/bin/dock 6 seconds ago Up 4 seconds 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch
用上面的CONTAINER ID产看启动时的日志
[root@bogon ~]# docker logs -f 7e4a811093d9
最后会打印出
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [3869] for user [elasticsearch] is too low, increase to at least [4096]
[2020-08-27T06:10:25,888][INFO ][o.e.n.Node ] [WG6mVz4] stopping ...
[2020-08-27T06:10:25,903][INFO ][o.e.n.Node ] [WG6mVz4] stopped
[2020-08-27T06:10:25,903][INFO ][o.e.n.Node ] [WG6mVz4] closing ...
[2020-08-27T06:10:25,928][INFO ][o.e.n.Node ] [WG6mVz4] closed
两行too low的提示就是容器退出的原因。
三个容器正确的启动命令如下
docker run --name mongo -d mongo:3
docker run --name elasticsearch \
-e "http.host=0.0.0.0" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
--ulimit nofile=65536:65536 --ulimit nproc=4096:409