为什么选用Graylog?
日志收集比较流行的方案有
- Elasticsearch+Graglog
- Elasticsearch+Logstash+Kibana 也就是ELK
其实ELK更为出名, 但为什么我会选择Graylog?
- Graylog技术栈小, 又是全家桶. 少使用了Logstash, 少学一个东西, life +1day.
- Graylog的Inputs很强大, 图形化配置. Docker也支持GELF(Graylog Extended Log Format)的logging driver, 方便.
安装
参照官方文档编写以下文件:
docker-compose.yml
version: '2'
services:
mongodb:
image: mongo:3
volumes:
- /workspace/docker/volumes/graylog/mongo_data:/data/db
elasticsearch:
image: elasticsearch:5.5.1
volumes:
- /workspace/docker/volumes/graylog/es_data:/usr/share/elasticsearch/data
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
# Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.5/security-settings.html#general-security-settings
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
mem_limit: 1g
graylog:
image: graylog/graylog:2.4.4-1
volumes:
- /workspace/docker/volumes/graylog/graylog_journal:/usr/share/graylog/data/journal
environment:
- GRAYLOG_PASSWORD_SECRET=xxxxxxxxxxx
- GRAYLOG_ROOT_PASSWORD_SHA2=xxxxxxxxxxxxxxx
- GRAYLOG_WEB_ENDPOINT_URI=http://graylog.bysir.store/api
links:
- mongodb:mongo
- elasticsearch:elasticsearch
ports:
# Graylog web interface and REST API
- 9001:9000
# GELF UDP
- 12201:12201/udp
depends_on:
- mongodb
- elasticsearch
运行它:
docker-compose up -d
访问Graylog的web界面 我这里是 http://graylog.bysir.store
(使用nginx反向代理9001端口)
输入账号(admin)密码(admin)登陆就能进入首页
配置
点击 "System>Inputs", 选择DELF UDP
之后点击Launch new input
选择Node(只有一个选项), 输入Title(可以随意输入)
点击save之后它就会出现在页面下方
点击
Start input
, 成功开启后就能接受日志了.
测试
启动一个docker测试日志:
设置docker的log驱动为GELF
docker run -d \
--log-driver=gelf \
--log-opt gelf-address=udp://localhost:12201 \
--log-opt tag="{{.ImageName}}/{{.Name}}/{{.ID}}" \
busybox sh -c 'while true; do echo "Hello, this is A"; sleep 10; done;'
或者在Rancher配置
gelf-address=udp://localhost:12201
tag={{.ImageName}}/{{.Name}}/{{.ID}}
回到Graylog Web刷新一下就能看到日志了
错误恢复
有一天发现不能搜索新日志了, 引起原因好像是服务器磁盘满了, 然后清理了下服务器磁盘, 但是还是不能搜索.
胡搞一通(如删除Inputs, 重启graylog全家), 发现一个日志都搜索不到了, 猝.
在Inputs里和右上角看日志输入, 发现能接受到消息, 再看Indices也是有数据量的, 看es的容器日志发现没什么毛病, 再看graylog的容器日志发现还是没什么毛病.
突然发现小红点中有一个这样的警告: Deflector exists as an index and is not an alias.
Google之, 找到两篇文章:
- How to fix “Deflector exists as an index and is not an alias” warning?
- How to delete graylog_deflector?
总结一下就是
- 关闭Graylog
- 删除es中的索引: graylog_deflector, 你可以进入到es容器中运行
curl -X DELETE 'http://127.0.0.1:9200/graylog_deflector'
即可 - 重新运行Graylog
正常情况下就好了, 如果还不行, 你可以再试一下以下方法:
关闭graylog全家并且删除graylog和es挂载出来的两个文件夹es_data
和graylog_journal
, 再重启.
注意: 删除es_data
会损失掉之前的日志文件, 如果日志很重要请谨慎操作. 同时一定别删除挂载出来的mongo_data
, 不然包括账号等graylog配置都会被重置.
其他注意事项
大于32766byte的日志将写不进ES, 可在 http://host.com/system/indices/failures 看到以下错误: (whose UTF8 encoding is longer than the max length 32766)
这么解决呢? 不要写这么长的日志就对了.
升级到Graylog 3.3
先挨着挨着看升级手册:
https://docs.graylog.org/en/3.3/pages/upgrade/graylog-3.0.html
- 将es image tag改为 5.6.13
- 将graylog image tag改为3.3
- 运行, 查看报错 解决问题.