文档章节

fluentd,elasticsearch,kibana,kafaka日志收集

whaon
 whaon
发布于 2017/04/16 12:05
字数 1681
阅读 1630
收藏 15

概述

日志收集框架有很多,logstash,flume,fluentd等等,这里我们使用fluentd
我们这里会尝试使用fluentd->elasticsearch->kibana搭建一个日志采集和展示平台
也可以使用fluent-plugin-kafka来把把采集的日志发送到kafka,然后在jstorm里对收集到的数据进一步加工处理,最后存入redis,流程为:

fluentd->kafka->jstorm->redis

顺便说下,现在logstash,elasticsearch,kibana都归属于elasticsearch
关于jstorm的相关说明可以参考另一篇文章: 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

访问http://172.16.154.235:9292 即可,用户名为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,修改为下面的配置

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  prefix="access_" suffix=".log" pattern="combined" fileDateFormat="yyyy-MM-dd.HH"  resolveHosts="true"/>

combined表示打印出来的是apache格式的日志,会附带Referer和User-Agent的信息
fileDateFormat设置的表示每个小时产生新的日志文件,不写此项表示每天轮巡
修改完重启tomcat即可,试着访问tomcat的应用,会在logs下看到相应的日志

修改td-agent配置

vi /etc/td-agent/td-agent.conf 修改内容如下:

<source>
    type tail
    path /usr/local/tomcat7/logs/access_*.log
    pos_file /var/log/td-agent/waf.log.pos
    tag test.waf
    format apache
</source>
<match test.waf>
    host 172.16.154.235
    type elasticsearch
    logstash_format true
    flush_interval 5s
    include_tag_key true
    tag_key mapred
</match>

注意source节点里面的format,这里为apache,说明解析的标准的apache日志,使用apache2也可以,实际使用的正则pattern为:

format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/

仔细对比输出的日志,会发现该pattern并没有提取出http版本的信息,我们可以稍微改下如下

format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+) ((?<path>[^ ]*) +(?<http>[^ ]*))?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/

改完重启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

完了直接访问http://172.16.154.235:9200

kibana

最前面说了,elasticsearch和kibana属于同一组织的,所以解压后的包结构非常相似,配置文件在config下,运行命令在bin下
需要改的是从哪台机器的elasticsearch获取数据elasticsearch_url
完了,启动

./bin/kibana

访问kibana地址:http://172.16.154.241:5601

错误排除

如果日志收集不成功,可以通过查看日志来排查问题
我这边出现的问题是td-agetn没有权限读取tomcat的logs目录里的内容,因为我的tomcat启动时是由一个名称为tomcat的用户来启动的,而fluentd也会自己创建一个名称为td-agent的用户来启动td-agent,所以就木有权限了,最简单的我们可以把td-agent用户加到root用户组即可

彩蛋

如果一开始不想为td-agent的正则匹配所纠结,或者日志不方便直接用td-agent进行解析,则可以使用如下的配置,把整个日志都收集起来,然后交给storm等进行具体的处理即可,配置如下

<source>
  @type    tail 
  format   /^(?<all>.*)$/
  path /usr/local/tomcat7/logs/access_*.log
  pos_file /var/log/td-agent/waf.log.pos
  tag test.waf
</source>

或者直接把format设为none,这样output会为json,key为message,value则为一整行的内容,当然key也是可以自定义的,添加下message_key my_message即可

---------------------------------------2017年4月21日17:45:29 加---------------------------------------

HA

我们之前的做法是,在生成日志的那台机器上采集,然后发送到elasticsearch,这2个操作都在一台机器上,对机器的消耗较大,也比较容易发生故障。现在我们可以把上述的步骤拆成2步来做,如下图所示: fluentd
在日志生成的那台机器log forwarders上只做收集,然后立即转发给其他log aggregators机器,所有的过滤以及进一步的操作比如发送给elasticsearch全部交给他,并且log aggregators本身也支持主备,即主挂了后,log forwarders会自动把日志发送给备。 这样大大降低了故障发生的概率
log forwarders的配置样例如下:

# TCP input
<source>
  @type forward
  port 24224
</source>

# HTTP input
<source>
  @type http
  port 8888
</source>

# Log Forwarding
<match mytag.**>
  @type forward

  # primary host
  <server>
    host 192.168.0.1
    port 24224
  </server>
  # use secondary host
  <server>
    host 192.168.0.2
    port 24224
    standby
  </server>

  # use longer flush_interval to reduce CPU usage.
  # note that this is a trade-off against latency.
  flush_interval 60s
</match>

© 著作权归作者所有

whaon

whaon

粉丝 49
博文 42
码字总数 38353
作品 0
厦门
程序员
私信 提问
加载中

评论(3)

吐槽的达达仔
吐槽的达达仔

引用来自“whaon”的评论

引用来自“吐槽的达达仔”的评论

td-agent坑我千百次。。我已入坑filebeat了~~
说来听听,踩的哪些坑😏

回复@whaon : td-agent对新kafka支持慢,然后断点续传有问题,不管kafka状态继续推送数据
whaon
whaon 博主

引用来自“吐槽的达达仔”的评论

td-agent坑我千百次。。我已入坑filebeat了~~
说来听听,踩的哪些坑😏
吐槽的达达仔
吐槽的达达仔
td-agent坑我千百次。。我已入坑filebeat了~~
kubernetes addons efk

一、简介 这个附加组件由Elasticsearch, Fluentd和Kibana组合而成。 通过结合这三个工具,我们获得了一个可扩展的,灵活的,易于使用的日志收集和分析管道。 Elasticsearch是一个搜索引擎,...

Bravepro
2018/06/29
0
0
七, 跨语言微服务框架 - Istio日志采集EFK

ELK日志系统大家不会陌生(zipkin + jaeger , prometheus + grafana)解决了大家对于链路对于统计采集的需求,但是真正的对于日志进行存储还是得专业的上,在Istio中官方提供的方案是EFK(Fluentd...

喵了_个咪
01/28
88
0
Kubernetes-基于EFK进行统一的日志管理

1、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大...

店家小二
2018/12/14
0
0
Kubernetes基于EFK进行统一的日志管理方案

1、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大...

店家小二
2018/12/17
0
0
Kubernetes-基于EFK进行统一的日志管理原理

EFK安装部署参考:https://blog.csdn.net/luanpeng825485697/article/details/83312662 1、统一日志管理的整体方案 通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和...

数据架构师
2018/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部