Graylog——日志分析平台完美代替Elasticsearch

Posted by Yancy on 2016-11-13

摘要: 提起日志聚合工具,有开源界的ELK,商业界的Splunk,但我要介绍开源的后起之秀Graylog,可以说是龙头老大Splunk的开源版。

Graylog——日志分析平台完美代替Elasticsearch

先看看 推荐!国外程序员整理的系统管理员资源大全 中,国外程序员整理的日志聚合工具的列表:

日志管理工具:收集,解析,可视化

  • Elasticsearch - 一个基于Lucene的文档存储,主要用于日志索引、存储和分析。
  • Fluentd - 日志收集和发出
  • Flume -分布式日志收集和聚合系统
  • Graylog2 -具有报警选项的可插入日志和事件分析服务器
  • Heka -流处理系统,可用于日志聚合
  • Kibana - 可视化日志和时间戳数据
  • Logstash -管理事件和日志的工具
  • Octopussy -日志管理解决方案(可视化/报警/报告)

Graylog与ELK方案的对比

  • ELK: Logstash -> Elasticsearch -> Kibana (使用了一些插件head ,marvel)
  • Graylog: Graylog Collector -> Graylog Server(封装Elasticsearch) -> Graylog Web

做为运维,公司内部使用elk处理日志发现很多问题。

顺便截图了几张:


之前试过Logstash + Elasticsearch + Kibana的方案,发现有几个缺点:

  1. 不能处理多行日志,比如Mysql慢查询,Tomcat/Jetty应用的Java异常打印
  2. 不能保留原始日志,只能把原始日志分字段保存,这样搜索日志结果是一堆Json格式文本,无法阅读。
  3. 不复合正则表达式匹配的日志行,被全部丢弃。
  4. kibana结合使用经常会出现卡死。资源消耗非常大。

本着解决以上3个缺点的原则,再次寻找替代方案。 首先找到了商业日志工具Splunk,号称日志界的Google,意思是全文搜索日志的能力,不光能解决以上3个缺点,还提供搜索单词高亮显示,不同错误级别日志标色等吸引人的特性,但是免费版有500M限制,付费版据说要3万美刀,只能放弃,继续寻找。 最后找到了Graylog,第一眼看到Graylog,只是系统日志syslog的采集工具,一点也没吸引到我。但后来深入了解后,才发现Graylog简直就是开源版的Splunk。 我自己总结的Graylog吸引人的地方:

  1. 一体化方案,安装方便,不像ELK有3个独立系统间的集成问题。
  2. 采集原始日志,并可以事后再添加字段,比如http_status_code,response_time等等。
  3. 自己开发采集日志的脚本,并用curl/nc发送到Graylog Server,发送格式是自定义的GELF,Flunted和Logstash都有相应的输出GELF消息的插件。自己开发带来很大的自由度。实际上只需要用inotifywait监控日志的modify事件,并把日志的新增行用curl/netcat发送到Graylog Server就可。
  4. 搜索结果高亮显示,就像google一样。
  5. 搜索语法简单,比如: source:mongo AND reponse_time_ms:>5000,避免直接输入elasticsearch搜索json语法
  6. 搜索条件可以导出为elasticsearch的搜索json文本,方便直接开发调用elasticsearch rest api的搜索脚本。

Graylog图解

Graylog开源版官网: https://www.graylog.org/

来几张官网的截图:

Graylog是强大的日志管理、分析工具。它基于 Elasticsearch, Java和MongoDB。

Graylog可以收集监控多种不同应用的日志。但是为了示范说明,我只收集syslog。并且,我将会把用到的组件全部安装到一个单独的服务器上。对于大型、生产系统你可以把组件分开安装在不同的服务器上,这样可以提高效率。

Graylog的组件

Graylog有4个基本组件:

1
2
3
4
Graylog Server:这个服务负责接收和处理日志/消息,并且和其他组件沟通。
Elasticsearch:存储所有的日志,它的性能依赖内存和硬盘IO。
MongoDB:存储元数据,负载不高。
graylog-Web接口:用户接口。

下面是Graylog组件之间的关系图:

下面来自我公司内部分享的PPT拍图:

生产环境 我参考网上一些博客画的图:

系统要求:

  • CentOS 6.7
  • 内存至少2GB
  • 有root权限
  • 服务器ip是192.168.1.234,已安装 1.8.0_77-b03

这里我只是举例单一模式跑服务。

安装MongoDB

MongoDB的安装非常简单,执行如下命令导入MongoDB GPG密钥到rpm:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@graylog yum.repos.d]# vim /etc/yum.repos.d/mongodb-org-3.0.repo
---
[mongodb-org-3.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.0/x86_64/
gpgcheck=0
enabled=1
---
[root@graylog yum.repos.d]# yum install -y mongodb-org
[root@graylog yum.repos.d]# vi /etc/yum.conf
最后一行添加:
---
exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
---
[root@graylog yum.repos.d]# service mongod start
[root@graylog yum.repos.d]# chkconfig mongod on
[root@graylog yum.repos.d]# vi /etc/security/limits.conf
最后一行添加:
---
* soft nproc 65536
* hard nproc 65536
mongod soft nproc 65536
* soft nofile 131072
* hard nofile 131072
---
[root@graylog ~]# vi /etc/init.d/mongod
ulimit -f unlimited 行前插入:
---
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
---
[root@graylog ~]# /etc/init.d/mongod restart

安装Elasticsearch

Graylog目前为止只能使用Elasticsearch 2.0以前的版本,所以,在这一步中,我将安装Elasticsearch 1.7.x。

添加Elasticsearch GPG密钥:

$ sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

创建Elasticsearch源:

$ sudo vim /etc/yum.repos.d/elasticsearch.repo

写入如下内容:

1
2
3
4
5
6
[elasticsearch-1.7]
name=Elasticsearch repository for 1.7.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.7/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

安装Elasticsearch:

$ sudo yum -y install elasticsearch

配置前先创建几个目录文件

mkdir /data/es-data -p
mkdir /data/es-work -p

Elasticsearch安装完成之后,编辑配置文件:

sudo vim /etc/elasticsearch/elasticsearch.yml

 node.data: true  # 数据存放true

找到cluster.name一行,取消这一行的注释,并把值改为graylog-development:

cluster.name: graylog-development


 path.data: /data/es-data     es数据存放目录  这里需要自己新建目录

 path.work: /data/es-work   

你也许想要限制外部访问Elasticsearch(端口9200),这样可以提高系统的安全性。找到network.host一行,取消注释,并把值改为localhost:

network.host: 192.168.1.234

保存退出文件。

重启Elasticsearch:

$ service elasticsearch start

设置开机启动:

$ chkconfig --add elasticsearch

执行如下命令测试Elasticsearch是否正常运行:

$ curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

输出的信息如下表示Elasticsearch安装成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
drwxr-xr-x. 2 root root 4096 923 2011 src
[root@ELK local]# curl -XGET 'http://192.168.1.234:9200/_cluster/health?pretty=true'
{
"cluster_name" : "graylog-development",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 37,
"active_shards" : 37,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 37,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0
}

安装Graylag

Graylog的最新版是1.1.4,下载链接如下:
https://packages.graylog2.org/repo/el/6Server/1.1/x86_64/graylog-server-1.1.4-1.noarch.rpm
https://packages.graylog2.org/repo/el/6Server/1.1/x86_64/graylog-web-1.1.4-1.noarch.rpm

现在Graylog的所有依赖软件安装完成,这一步我们来安装graylog-server。

首先,下载Graylog RPM软件包:

$ cd 
$ sudo rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-1.3-repository-el7_latest.rpm

安装graylog-server:

yum -y install graylog-server

安装pwgen,我们使用它生成随机密码:

yum -y install epel-release
yum -y install pwgen

现在我们来设置Graylog管理员的密钥。配置文件位于/etc/graylog/server/server.conf目录,需要修改password_secret参数:

$ SECRET=$(pwgen -s 96 1)
$ sudo -E sed -i -e 's/password_secret =.*/password_secret = '$SECRET'/' /etc/graylog/server/server.conf

执行完上面命令之后,password_secret参数的样子:

这一步,设置管理员密码。由于密码使用sha哈希算法,我们需要把明文密码转换为hash,然后赋值给root_password_sha2参数。例如,我要设置的管理员密码是 Ihaozhuo_b313,它对应的hash为:

$ echo -n Ihaozhuo_b313 | sha256sum | awk '{print $1}'

编辑/etc/graylog/server/server.conf,设置root_password_sha2参数:

$ sudo vim /etc/graylog/server/server.conf

现在Graylog管理员密码为Ihaozhuo_b313。

配置rest_transport_uri参数,设置Graylog web接口和服务器的沟通方式。由于我们把所有组件都安装到了单独的一个服务器上,需要把值设置为127.0.0.1localhost。找到rest_transport_uri一行,取消注释,并把值设置为:

rest_transport_uri = http://192.168.1.234:12900/

由于我们只有一个Elasticsearch shard,需要把elasticsearch_shards参数设置为1:

elasticsearch_shards = 1

更改elasticsearch_cluster_name参数,应该和前面Elasticsearch的cluster.name参数相对应:

elasticsearch_cluster_name = graylog-development

取消下面两行的注释,检测Elasticsearch:

172 elasticsearch_discovery_zen_ping_multicast_enabled = false
173 elasticsearch_discovery_zen_ping_unicast_hosts = 192.168.1.234:9300

启动graylog-server:

/etc/init.d/graylog-web restart

安装Graylog Web

安装Graylog Web:

$ sudo yum -y install graylog-web

安装完成之后配置Graylog Web的密钥,配置文件位于/etc/graylog/web/web.conf,更改application.secret参数:

$ SECRET=$(pwgen -s 96 1)
$ sudo -E sed -i -e 's/application\.secret=""/application\.secret="'$SECRET'"/' /etc/graylog/web/web.conf

配置graylog2-server.uris参数,它的值应该和Graylog的rest_listen_uri参数相对应:

$ sudo vim /etc/graylog/web/web.conf

graylog2-server.uris="http://127.0.0.1:12900/"

重启graylog-web:

/etc/init.d/graylog-web restart

配置Graylog服务器接收其他服务器的syslog日志

登录Graylog Web

使用浏览器访问Graylog服务器的域名或IP:http://graylog_public_IP_domain:9000/

你应该能看到一个登录界面,使用admin做为用户名和前面设置的密码登录。

登录之后:

上面的红数字1是通知(you have a node without any running inputs),下面设置通过UDP接收syslog。

创建syslog UDP输入

添加要接收的其他服务器syslog日志:System->Inputs->Syslog UDP->Launch new input。

在弹出的窗口上输入如下信息:

  • Title: syslog
  • Port: 8514
  • Bind address: 这里写Graylog-server服务器主机IP

点击Launch

如果你需要收集多个服务器的日志,重复上面步骤。

现在,我们的Graylog服务器已经做好了接收其他服务器发来日志的准备。下面我们还需要配置其他服务器,让这些服务器给Graylog服务器发送日志。

配置其他服务器给Graylog服务器发送syslog

参考官网:从Linux系统日志发送到Graylog

SSH登录“其他服务器”,创建rsyslog配置文件90-graylog.conf:

sudo vim /etc/rsyslog.d/90-graylog.conf

添加如下代码,把 graylog_server_IP 替换为Graylog服务器ip地址:

$template GRAYLOGRFC5424,"<%pri%>%protocol-version% %timestamp:::date-rfc3339%    %HOSTNAME% %app-name% %procid% %msg%\n"
*.* @graylog_server_IP:8514;GRAYLOGRFC5424

重启rsyslog服务使生效:

/etc/init.d/rsyslog restart

配置完成之后,回到Graylog Web,点击Sources,查看是否有新添加rsyslog。

Graylog使用http协议发送:

添加要接收的其他服务器syslog日志:System->Inputs->GELF HTTP->Launch new input。

然后在服务器上面发送下面命令。

1
2
[root@graylog-development ~]# curl -XPOST http://192.168.1.234:12201/gelf -p0 -d '{"short_message":"Hello there", "host":"example.org", "facility":"test", "_foo":"bar"}'
[root@graylog-development ~]# curl -XPOST http://192.168.1.234:12201/gelf -p0 -d '{"short_message":"测试", "host":"example.org", "facility":"test", "_foo":"bar"}'

这里定义192.168.1.234 是graylog-server服务器地址 12201 端口是之前创建好的。

搜素Graylog

假如你要搜索hello:

上面安装配置了基本的Graylog服务器。

时区和高亮设置

admin帐号的时区:

1
2
3
4
5
[root@graylog ~]# vi /etc/graylog/server/server.conf
---
30 root_timezone = Asia/Shanghai
---
[root@graylog ~]# /etc/init.d/graylog-server restart

其他帐号的默认时区:

1
2
3
4
5
[root@graylog ~]# vi /etc/graylog/web/web.conf
---
18 timezone="Asia/Shanghai"
---
[root@graylog ~]# /etc/init.d/graylog-web restart

允许查询结果高亮:

1
2
3
4
5
[root@graylog ~]# vi /etc/graylog/server/server.conf
---
147 allow_highlighting = true
---
[root@graylog ~]# /etc/init.d/graylog-server restart

移动数据目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
移动elasticsearch的数据目录
[root@graylog ~]# sudo /etc/init.d/elasticsearch stop
[root@graylog ~]# sudo cp -rp /var/lib/elasticsearch/ /data/
[root@graylog ~]# sudo vi /etc/sysconfig/elasticsearch
+16 DATA_DIR=/data/elasticsearch
[root@graylog ~]# sudo /etc/init.d/elasticsearch start
移动mongo的数据目录
[root@graylog ~]# sudo /etc/init.d/mongod stop
[root@graylog ~]# sudo cp -rp /var/lib/mongo /data/
[root@graylog ~]# sudo vi /etc/mongod.conf
---
13 dbpath=/var/lib/mongo
->
13 dbpath=/data/mongo
---
[mtagent@access2 ~]$ sudo /etc/init.d/mongod start

其余参考文档

参考官网

Centos7 搭建graylog

Graylog——日志聚合工具中的后起之秀