日志收集折腾过程
ELK
之前整合过ELK做日志采集,就是Elasticsearch + Logstash + Kibana:
- Elasticsearch:存储引擎,存放日志内容,利于全文检索
- Logstash:数据传输管道,将日志内容传输到Elasticsearch,并且支持过滤内容,将内容格式化后再传输,可以满足绝大部分的应用场景
- Kibana:开源的分析和可视化平台,在这里查看Elasticsearch中的数据
对我来说ELK有点重,服务占用资源高,并且部署和维护有些复杂,我的个人服务器玩这个有点力不从心,所以一直有在寻找替代方案。
EFK
Elasticsearch + Filebeat + Kibana,用Filebeat替代Logstash做日志的收集,它是由Golang开发,够轻量,占用资源少,如果没有过滤日志内容进行格式化的需求,用这个替代Logstash是很不错的选择。
ELFK
四个框架全用,网上看到有大佬这样用,应该是企业级别的部署,看着我就敬而远之,不敢玩。
自己撸一个
我对EFK的服务占用感到不满,于是自己用Golang写了一个轻量级工具,没有做采集、过滤,仅仅是从日志文件夹中grep出想要的内容,其实和手动grep没区别,不过可以用接口的方式查出想要的内容,而且极其轻量,这个工具我还用过好一段时间。
我把EFK的搭建过程和手撸工具的过程写在了这里,感兴趣可以去看看。
Graylog
最近我在折腾另一个日志收集方案,并且感觉不错,就是Graylog,它需要整合Mongo + Elasticsearch,它比较简单易用,提供网页端可视化页面,相当于Kibana,还支持日志报警。
值得说明的是,它支持处理多行日志,而在ELK中,多行日志需要用Logstash做一些格式化配置,这一点来说Graylog就做的很棒。
至于为什么需要整合Mongo,是因为需要借助Mongo来保存一些Graylog的配置信息。
环境搭建
我喜欢用Docker来搭建环境,所以如果你通过其他方式,可以到官网寻求答案
首先拉取一下镜像:
docker pull elasticsearch:7.12.0
docker pull graylog/graylog:4.3.6
docker pull mongo:4.2
复制代码
docker-compose.yml:
version: '3'
services:
mongo:
image: mongo:4.2
container_name: mongo # graylog内默认连接名为mongo,所以这个不建议改
restart: always
volumes:
- /home/mycontainers/mongo/data:/data/db # 路径映射
ports:
- 27017:27017
network_mode: mynetwork # 设置网段
elasticsearch:
image: elasticsearch:7.12.0
container_name: elasticsearch # graylog内默认连接名为elasticsearch,所以不建议改
environment:
- "TAKE_FILE_OWNERSHIP=true" # 挂载目录需要这个,不然没有权限
- "discovery.type=single-node" # 设置为单节点,集群就等进阶再说了
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 分配堆大小
volumes:
- /home/mycontainers/es/data:/usr/share/elasticsearch/data
- /home/mycontainers/es/logs:/usr/share/elasticsearch/logs
ulimits: # 调整 ulimits 以及 nprocedit
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 1g # 限制使用内存
ports:
- 9200:9200
- 9300:9300
network_mode: mynetwork
graylog:
image: graylog/graylog:4.3.6
container_name: graylog
environment:
# echo -n "Enter Password: " && head -1 < /dev/stdin | tr -d '\n' | sha256sum | cut -d " " -f1
- GRAYLOG_PASSWORD_SECRET=somepasswordpepper # 用于密码加密加盐
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918 # 密码,默认是admin,可以用上面的echo命令生成自己的密码
- GRAYLOG_HTTP_EXTERNAL_URI=http://127.0.0.1:9009/ # 对外开放的链接,注意端口,我改成了9009
# volumes:
# - /home/mycontainers/graylog/config/graylog.conf:/usr/share/graylog/data/config/graylog.conf
network_mode: mynetwork
restart: always
depends_on:
- mongo # 依赖于mongo和es两个环境
- elasticsearch
ports:
- 9009:9000 # 端口映射
# Syslog TCP
- 1514:1514
# Syslog UDP
- 1514:1514/udp
# GELF TCP
- 12201:12201
# GELF UDP
- 12201:12201/udp
复制代码
执行运行命令:
docker-compose -f docker-compose.yml