概述
日志收集框架有很多,logstash,flume,fluentd等等,这里我们使用fluentd
我们这里会尝试使用fluentd->elasticsearch->kibana搭建一个日志采集和展示平台 也可以使用fluent-plugin-kafka来把把采集的日志发送到kafka,然后在jstorm里对收集到的数据进一步加工处理,最后存入redis,流程为:fluentd->kafka->jstorm->redis
顺便说下,现在logstash,elasticsearch,kibana都归属于elasticsearch
关于jstorm的相关说明可以参考另一篇文章:环境
CentOS release 6.7 (Final)
软件
- td-agent-2.3.0(fluentd),为最新版本,这里为什么是td-agent了,因为td-agent是fluentd的稳定版本,推荐使用
- elasticsearch-2.4.4,不为最新版本,支持JDK7,最新版本为elasticsearch-5.3.0,需要JDK8的支持,而笔者的环境为JDK7,故使用elasticsearch-2.4.4
- kibana-4.6.4-linux-x86_64,不为最新版本,最新版本为kibana-5.3.0-linux-x86_64,需要Elasticsearch v5.3.0的支持
机器
172.16.154.235:td-agent,elasticsearch
172.16.154.241:kibana安装td-agent
准备工作
执行ulimit -n,如果显示1024,则需要调整vi /etc/security/limits.conf,在末尾添加如下内容:
root soft nofile 65536 root hard nofile 65536 * soft nofile 65536 * hard nofile 65536 需要退出当前用户重新登录 fluentd是用ruby和C开发的,我们需要安装ruby相关的环境以便方便的操作:yum install ruby rubygems -y
安装
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
来安装td-agent,该命令实际是下载了一个新的yum源,然后通过yum install的方式来安装,但是可能会执行失败,如果出现什么认证啊权限啊什么的问题,直接执行下面的命令来安装即可:
yum install --nogpgcheck td-agent -y
安装好后,就可以执行以下命令了
/etc/init.d/td-agent start /etc/init.d/td-agent status
同时也支持service的执行方式如下:
service td-agent status
配置文件在/etc/td-agent/td-agent.conf
测试
现在就可以测试了,默认监听8888端口,监听来自HTTP的请求,并且会输出到/var/log/td-agent/td-agent.log 可以执行以下命令来测试:
curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test
UI
fluentd提供了一个UI,可以很方便进行管理
如果你通过上述方式安装的,那默认就已经安装了td-agent-ui,直接执行td-agent-ui start即可 如果没有安装,则通过如下命令进行安装:gem install -V fluentd-ui
访问 即可,用户名为admin,密码为changeme
配置
input
fluentd支持多种input,一般常用的为tail,即为读取日志文件追加的内容,已经存在的内容则不会读取
output
output常见的有mongodb,elasticsearch,kafka等,只需安装相关的插件即可,以elasticsearch为例,执行:
td-agent-gem install fluent-plugin-elasticsearch
下面的例子就会用到该插件
在td-agent-ui中也可以管理插件哦收集tomcat日志
下面以收集tomcat日志为例,讲具体的配置
修改tomcat配置
修改conf/server.xml,修改为下面的配置
combined表示打印出来的是apache格式的日志,会附带Referer和User-Agent的信息
fileDateFormat设置的表示每个小时产生新的日志文件,不写此项表示每天轮巡 修改完重启tomcat即可,试着访问tomcat的应用,会在logs下看到相应的日志修改td-agent配置
vi /etc/td-agent/td-agent.conf
修改内容如下:
注意source节点里面的format,这里为apache,说明解析的标准的apache日志,使用apache2也可以,实际使用的正则pattern为:
format /^(?[^ ]*) [^ ]* (? [^ ]*) \[(?
仔细对比输出的日志,会发现该pattern并没有提取出http版本的信息,我们可以稍微改下如下
format /^(?[^ ]*) [^ ]* (? [^ ]*) \[(?
改完重启td-agent即可
service td-agent restart
elasticsearch
下面在241上安装elasticsearch,极其简单,下载压缩包解压即可,vi bin/elasticsearch, 添加
ES_JAVA_OPTS="-Des.insecure.allow.root=true"
否则启动会有问题
vi config/elasticsearch.yml
修改network.host为本地IP,端口用默认9200即可
执行./bin/elasticsearch
启动即可,如果想要后台执行: /bin/elasticsearch -d
完了直接访问
kibana
最前面说了,elasticsearch和kibana属于同一组织的,所以解压后的包结构非常相似,配置文件在config下,运行命令在bin下
需要改的是从哪台机器的elasticsearch获取数据elasticsearch_url 完了,启动./bin/kibana
访问kibana地址:
错误排除
如果日志收集不成功,可以通过查看日志来排查问题
我这边出现的问题是td-agetn没有权限读取tomcat的logs目录里的内容,因为我的tomcat启动时是由一个名称为tomcat的用户来启动的,而fluentd也会自己创建一个名称为td-agent的用户来启动td-agent,所以就木有权限了,最简单的我们可以把td-agent用户加到root用户组即可彩蛋
如果一开始不想为td-agent的正则匹配所纠结,或者日志不方便直接用td-agent进行解析,则可以使用如下的配置,把整个日志都收集起来,然后交给storm等进行具体的处理即可,配置如下
或者直接把format设为none,这样output会为json,key为message,value则为一整行的内容,当然key也是可以自定义的,添加下message_key my_message即可
---------------------------------------2017年4月21日17:45:29 加---------------------------------------
HA
我们之前的做法是,在生成日志的那台机器上采集,然后发送到elasticsearch,这2个操作都在一台机器上,对机器的消耗较大,也比较容易发生故障。现在我们可以把上述的步骤拆成2步来做,如下图所示:
在日志生成的那台机器log forwarders上只做收集,然后立即转发给其他log aggregators机器,所有的过滤以及进一步的操作比如发送给elasticsearch全部交给他,并且log aggregators本身也支持主备,即主挂了后,log forwarders会自动把日志发送给备。 这样大大降低了故障发生的概率 log forwarders的配置样例如下:# TCP input