采集系统(就是如何处理多台机器线上系统的日志(组图) )

优采云 发布时间: 2021-12-05 03:20

  采集系统(就是如何处理多台机器线上系统的日志(组图)

)

  如今,多核和分布式软件开发已成为常态。基本上,较大的应用程序分布在多台机器上。分布式在提高性能的同时带来了很多问题。今天只讨论一点,就是多机联机系统的日志如何处理。

  以我们公司的一个应用T为例。部署在5台百度云机器上,其中一台有公网IP,使用百度云提供的负载均衡服务。每次要检索日志中的某个关键字,基本步骤如下:

  当然,我们可以编写脚本来简化这个过程,或者使用cssh之类的工具。但成功登录五台机器只是任务的开始。接下来,我们要手动选择我们要检索的日志(日志是按照日期存储的),使用grep进行检索,然后在五个shell上一一查看结果。. 如果有稍微高级的需求,比如检查某个关键词是否在昨天和今天的日志中都出现过,那么任务就会变得很麻烦,而且使用shell很容易出错。

  从这个过程,我们可以总结出分布式系统日志处理的需求。希望有这样一个日志处理系统,具有以下功能:

  幸运的是,elastic 提供了一套非常先进的工具 ELKB 来满足这些需求。ELKB是指用于日志分析或数据分析的四个软件,每个软件都有独立的功能,可以组合在一起。我们先简单介绍一下这四个软件。

  安装

  这里我们以 CentOS 7 为例来说明如何安装这些软件。ELK只需要安装在服务器上进行日志采集和分析,而Beats则需要安装在每台日志生成机器(客户端)上,当然也可能包括日志采集服务器本身。

  爪哇

  $ yum install java-1.8.0

copy code

  搜索

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

$ echo '[elasticsearch-2.x]

name=Elasticsearch repository for 2.x packages

baseurl=http://packages.elastic.co/elasticsearch/2.x/centos

gpgcheck=1

gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch

enabled=1

' | tee /etc/yum.repos.d/elasticsearch.repo

$ yum install elasticsearch

copy code

  日志存储

  $ vim /etc/yum.repos.d/logstash.repo

# 添加以下内容

[logstash-2.4]

name=logstash repository for 2.2 packages

baseurl=http://packages.elasticsearch.org/logstash/2.2/centos

gpgcheck=1

gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch

enabled=1

# 安装

$ yum install logstash

copy code

  基巴纳

  $ vim /etc/yum.repos.d/kibana.repo

# 添加以下内容

[kibana-4.6]

name=Kibana repository for 4.4.x packages

baseurl=http://packages.elastic.co/kibana/4.4/centos

gpgcheck=1

gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch

enabled=1

# 安装

$ yum install kibana

copy code

  节拍

  节拍分为多种类型,每种类型都采集特定信息。常用的是Filebeat,它监控文件变化,传输文件内容。一般来说,Filebeat 对日志系统来说就足够了。

  我们切换到客户端。首先,您还需要导入 GPG KEY。

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

copy code

  创建一个新的存储库并安装它。

  $ vim /etc/yum.repos.d/elastic-beats.repo

# 添加以下内容

[beats]

name=Elastic Beats Repository

baseurl=https://packages.elastic.co/beats/yum/el/$basearch

enabled=1

gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch

gpgcheck=1

# 安装

$ yum install filebeat

copy code

  弹性搜索

  Elasticsearch 不需要太多配置,只需要屏蔽外网访问即可。修改配置文件/etc/elasticsearch/elasticsearch.yml。

  network.host: localhost

copy code

  启动elasticsearch,服务elasticsearch 启动。

  Elasticsearch 本身可以被认为是一个 NoSQL 数据库,通过 REST API 进行操作。数据存储在索引中,相当于elastcisearch中SQL中的一张表。因为elasticsearch主要用于检索数据,所以index有一个叫做mapping的配置。我们用mapping来告诉elasticsearch数据的一些相关信息,比如某个字段是什么数据类型,是否创建索引等。我们先玩elasticsearch,以官方的莎士比亚数据集为例。

  $ curl localhost:9200/_cat/indices?v # 查看当前所有的index

health status index pri rep docs.count docs.deleted store.size pri.store.size # 没有任何index

# 创建shakespeare索引,并设置mapping信息

# speaker字段和play_name不需要分析,elasticsearch默认会拆分字符串中的每个词并进行索引

$ curl -XPUT http://localhost:9200/shakespeare -d '

{

"mappings" : {

"_default_" : {

"properties" : {

"speaker" : {"type": "string", "index" : "not_analyzed" },

"play_name" : {"type": "string", "index" : "not_analyzed" },

"line_id" : { "type" : "integer" },

"speech_number" : { "type" : "integer" }

}

}

}

}

';

$ curl localhost:9200/_cat/indices?v # 查看索引

health status index pri rep docs.count docs.deleted store.size pri.store.size

yellow open shakespeare 5 1 0 0 260b 260b

# 下载数据,并将数据集load进索引中

$ wget https://www.elastic.co/guide/en/kibana/3.0/snippets/shakespeare.json

$ curl -XPOST 'localhost:9200/shakespeare/_bulk?pretty' --data-binary @shakespeare.json

# 以上操作完成后,elasticsearch中就已经有了我们load的所有数据,并建立好了索引,我们可以开始查询了

# 查询一下含有'man'这个词的text_entry

$ curl -s 'localhost:9200/shakespeare/_search?q=text_entry:man&pretty=1&size=20' | jq '.hits.hits | .[]._source.text_entry'

"man."

"Man?"

"man."

"Why, man?"

"Worthy man!"

"Every man,"

"complete man."

"married man?"

"melancholy man."

"Speak, man."

"Why, man?"

"What, man?"

"prave man."

"Speak, man."

"Why, man?"

"So man and man should be;"

"O, the difference of man and man!"

"The young man is an honest man."

"A gross fat man."

"plain-dealing man?"

copy code

  下面我们通过解析nginx的访问日志来讲解ELKB的使用方法。

  解析 Nginx 访问日志

  整个过程的流程比较简单。Filebeat 采集日志并将它们发送到 Logstash。在 logstash 解析它们之后,将它们写入 ealsticsearch。最后,我们使用 kibana 查看和检索这些日志。

  文件节拍

  首先切换到客户端,我们来配置filebeat。

  $ vim /etc/filebeat/filebeat.yml

...

prospectors:

-

paths:

- /var/log/nginx/access.log

# 找到document_type字段,取消注释,这个字段会告诉logstash日志的类型,对应logstash中的type字段

document_type: nginx

...

# 默认输出为elasticsearch,注释掉,使用logstash

logstash:

hosts: ["IP:5044"] # 注意更改这里的IP

copy code

  日志存储

  logstash的配置比较麻烦,因为logstash需要接受输入,处理,产生输出。Logstash 采用输入、过滤、输出三阶段配置方式。input配置输入源,filter配置如何处理输入源中的信息,output配置输出位置。

  一般来说,输入是节拍的。在filter中,我们解析输入得到的日志,得到我们想要的字段,输出是elasticsearch。这里我们以nginx的访问日志为例。过滤器中有一个关键的东西叫grok,我们用这个东西来解析日志结构。logstash 提供了一些默认的 Patterns,方便我们分析和使用。当然,我们也可以自定义模式,有规律地匹配日志内容。

  $ vim /etc/logstash/conf.d/nginx.conf

input {

beats {

port => 5044

}

}

filter {

if [type] == "nginx" { # 这里的type是日志类型,我们在后面的filebeat中设定

grok {

match => { "message" => "%{COMBINEDAPACHELOG} %{QS:gzip_ratio}" } # 使用自带的pattern即可,注意空格

remove_field => ["beat", "input_type", "message", "offset", "tags"] # filebeat添加的字段,我们不需要

}

# 更改匹配到的字段的数据类型

mutate {

convert => ["response", "integer"]

convert => ["bytes", "integer"]

convert => ["responsetime", "float"]

}

# 指定时间戳字段以及具体的格式

date {

match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]

remove_field => ["timestamp"]

}

}

}

outpugst {

elasticsearch {

hosts => [ "localhost:9200" ]

index => "%{type}-%{+YYYY.MM.dd}" # index中含有时间戳

}

}

copy code

  服务logstash start 可以启动logstash。注意它的启动速度很慢。

  弹性搜索

  在上面的logstash配置中,我们可以看到最终写入elasticsearch的索引收录时间戳,这是比较推荐的做法。因为方便我们每天分析数据。关于elasticsearch,我们只需要配置index Mapping信息即可。因为我们的索引是每天生成的,每天都是一个新的索引,当然不可能每天都配置索引Mapping。这里需要用到elasticsearch的一个特性,Index Template。我们可以创建一个索引配置模板,并使用这个模板来配置所有匹配的索引。

  curl -XPUT localhost:9200/_template/nginx -d '

{

"template": "nginx*",

"mappings": {

"_default_": {

"properties": {

"clientip": {

"type": "string",

"index": "not_analyzed"

},

"ident": {

"type": "string"

},

"auth": {

"type": "string"

},

"verb": {

"type": "string"

},

"request": {

"type": "string"

},

"httpversion": {

"type": "string"

},

"rawrequest": {

"type": "string"

},

"response": {

"type": "string"

},

"bytes": {

"type": "integer"

},

"referrer": {

"type": "string"

},

"agent": {

"type": "string"

},

"gzip_ratio": {

"type": "string"

}

}

}

}

}

'

copy code

  上面的代码创建了一个名为 nginx 的模板,匹配所有以 nginx 开头的索引。

  基巴纳

  Kibana 不需要任何配置,直接启动即可。service kibana start,默认运行在5601端口。如果考虑安全性,也可以将kibana配置为只*敏*感*词*本地机器,然后使用nginx进行反向代理和控制权限,这里不再赘述。

  接下来,我们需要生成一个日志,然后可以在kibana中查看,以表明系统运行正常。我们使用curl在客户端随机请求nginx生成一个小日志。然后,打开kibana,[服务器ip]:5601。刚进入的时候,首先需要配置Kibana的Index Pattern,告诉kibana我们要查看哪些Index数据,输入nginx*,然后点击Discover浏览数据。

  最终效果如下,我们可以在kibana中浏览我们的nginx日志,进行任意搜索。

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线