ELK日志分析系统搭建

系统框架

ELK是Elasticsearch、Logstash、Kibana的简称,是我们搭建的日志分析系统的核心部分。另外为了方便日志的收集我们启用了另一个工具Filebeat

Elasticsearch

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多用户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。

Logstash

Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。

Kibana

Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch中的数据。它利用Elasticsearch的REST接口来检索数据,允许用户创建他们自己的数据的定制仪表板视图,并以特殊的方式查询和过滤数据。

Filebeat

Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集,解析和可视化。

系统落地

基于自己目前的需求我们把框架大致描述如下


ELK日志监控

Filebeat部署在日志产生的机器,实时监控增量日志并发送给Logstash集中处理,Logstash通过不同的filter过滤并处理日志到需要的格式,然后发送给Elasticsearch,通过Kibana就可以实现日志的查看和分析。Elasticsearch可以做集群部署,Logstash发送日志时就要发送给所有机器。

安装

目前日志的数据量还不算太大,因此打算对Elasticsearch+Logstash+Kibana进行单机部署,环境CentOS Linux 7

安装JDK

Elasticsearch需要依赖Java环境,因此需要先安装JDK

$ sudo yum install java-1.8.0-openjdk
$ java -version
openjdk version "1.8.0_191"
OpenJDK Runtime Environment (build 1.8.0_191-b12)
OpenJDK 64-Bit Server VM (build 25.191-b12, mixed mode)

安装 Elasticsearch

1、选择下载合适的编译版本

$wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.tar.gz

2、解压文件

$ tar xzvf elasticsearch-6.3.1.tar.gz

3、查看目录结构

LICENSE.txt
NOTICE.txt
README.textile
bin
config
data
lib
logs
modules
plugins

4、修改配置文件

$ vi config/elasticsearch.yml

找到 # network.host 一行,修改成以下:
network.host: localhost
5、创建用户组和用户
因为Elasticsearch不能用root账户启动,因此我们得新建一个用户

$ groupadd elasticsearch
$ useradd -g elasticsearch elasticsearch

6、启动Elasticsearch

$ cd bin
$ ./elasticsearch

7、验证

$ curl 'localhost:9200/'
{
  "name" : "qc9y6mz",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "HzDB3zAsTPKCYRsISfBqaQ",
  "version" : {
    "number" : "6.3.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "eb782d0",
    "build_date" : "2018-06-29T21:59:26.107521Z",
    "build_snapshot" : false,
    "lucene_version" : "7.3.1",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

8、创建服务
为了保证每次开机Elasticsearch服务能自行启动,我们创建一个systemctl的服务

$ cd /usr/lib/systemd/system
$ touch elasticsearch.service
$ vi elasticsearch.service
[Unit]
Description=ElasticSearch Service
After=network.target
[Service]
User=elasticsearch
Group=elasticsearch
Type=simple
ExecStart=/home/elk/elasticsearch-6.3.1/bin/elasticsearch
Restart=on-failure
[Install]
WantedBy=default.target

设置开机自启动

$ systemctl enable elasticsearch.service
$ systemctl start elasticsearch.service

安装 Kibana

1、选择下载合适的编译版本(版本号跟Elasticsearch保持一致)

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.3.1-linux-x86_64.tar.gz

2、解压文件

$ tar xzvf kibana-6.3.1-linux-x86_64.tar.gz

3、查看目录结构

LICENSE.txt
NOTICE.txt
README.txt
bin
config
data
node
node_modules
optimize
package.json
plugins
src
webpackShims
yarn.lock

4、修改配置文件

$ vi config/elasticsearch.yml

server.host: "localhost"
xpack.security.enabled: false

5、创建服务

$ cd /usr/lib/systemd/system
$ touch kibana.service
$ vi kibana.service
[Unit]
Description=Kibana Service
After=network.target
[Service]
Type=simple
ExecStart=/home/elk/kibana-6.3.1-linux-x86_64/bin/kibana
Restart=on-failure
[Install]
WantedBy=default.target

设置开机自启动

$ systemctl enable kibana.service
$ systemctl start kibana.service

6、Nginx反向代理
由于Kibana我们配置的启动监听localhost:5601,因此需要通过Nginx做一下反向代理才能访问
配置Nginx

server {
    listen       8001;
    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

安装 Logstash

1、选择下载合适的编译版本(版本号跟Elasticsearch保持一致)

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.3.1.tar.gz

2、解压文件

$ tar xzvf logstash-6.3.1.tar.gz

3、查看目录结构

CONTRIBUTORS
Gemfile
Gemfile.lock
LICENSE.txt
NOTICE.TXT
bin
config
data
lib
logs
logstash-core
logstash-core-plugin-api
modules
patterns
tools
vendor
x-pack

4、创建配置文件

$ cd /home/elk/logstash-6.3.1/config
$ touch logstash.conf

根据需要创建配置,需要结合Filebeat的配置

input {
     # 监听地址和端口,接收来自Filebeat的数据
    beats {
        host => "192.168.31.29"
        port => "5044"
    }
}
filter {
    # 匹配nginx日志数据
    if [fields][service] == "web" {
        grok {
            match => { "message" => ["%{IPORHOST:[nginx][remote_ip]} - %{DATA:[nginx][user_name]} \[%{HTTPDATE:[nginx][time]}\] \"%{WORD:[nginx][method]} %{DATA:[nginx][url]} HTTP/%{NUMBER:[nginx][http_version]:float}\" %{NUMBER:[nginx][response_code]:int} %{NUMBER:[nginx][body_sent][bytes]:int} \"%{DATA:[nginx][referrer]}\" \"%{DATA:[nginx][agent]}\""] }
            remove_field => "message"
        }
        date {
            match => [ "[nginx][time]", "dd/MMM/YYYY:H:m:s Z" ]
            target => "@timestamp"
            remove_field => "[nginx][time]"
        }
        useragent {
            source => "[nginx][agent]"
            target => "[nginx][user_agent]"
            remove_field => "[nginx][agent]"
        }
        geoip {
            source => "[nginx][remote_ip]"
            target => "[geoip]"
        }
        urldecode {
            all_fields => true
        }
    }
    # 匹配接口访问数据
    if [fields][service] == "api-access" {
        grok {
            patterns_dir => ["/home/elk/logstash-6.3.1/patterns"]
            match => { "message" => ["\[%{CTIME:[logdate]}\] \[%{WORD:[category]}\] %{WORD:[scheme]} - %{IPORHOST:[remote_ip]} - \"%{WORD:[method]} %{DATA:[path]} HTTP/%{NUMBER:[http_version]:float}\" %{NUMBER:[response_code]:int} %{NUMBER:[content_length]:int} %{NUMBER:[response_time]:int} \"%{DATA:[referrer]}\" \"%{DATA:[agent]}\""] }
            remove_field => "message"
        }
        useragent {
            source => "[agent]"
            target => "[user_agent]"
            remove_field => "[agent]"
        }
        date {
            match => ["[logdate]", "yyyy-MM-dd'T'HH:mm:ss.SSS"]
            target => "@timestamp"
            remove_field => ["logdate"]
        }
        geoip {
            source => "[remote_ip]"
            target => "[geoip]"
        }
        urldecode {
            all_fields => true
        }
    }
    # 匹配接口访问错误数据
    if [fields][service] == "api-error" {
        grok {
            patterns_dir => ["/home/elk/logstash-6.3.1/patterns"]
            match => { "message" => ["\[%{CTIME:[time]}\] \[%{WORD:[category]}\] %{WORD:[type]} - %{WORD:[method]}:%{DATA:[path]} - %{NUMBER:[response_code]:int} - \[%{DATA:[opeator]}\] - %{NUMBER:[system_code]:int} - %{DATA:[system_msg]} - %{DATA:[system_payload]} - %{GREEDYDATA:[system_data]}"] }
            remove_field => "message"
        }
        date {
            match => ["[logdate]", "yyyy-MM-dd'T'HH:mm:ss.SSS"]
            target => "@timestamp"
            remove_field => ["logdate"]
        }
        urldecode {
            all_fields => true
        }
    }
    # 匹配接口操作数据
    if [fields][service] == "api-info" {
        grok {
            # 自定义正则匹配路径
            patterns_dir => ["/home/elk/logstash-6.3.1/patterns"]
            match => { "message" => ["\[%{CTIME:[time]}\] \[%{WORD:[category]}\] %{WORD:[type]} - %{WORD:[method]}:%{DATA:[path]} - %{NUMBER:[response_code]:int} - \[%{DATA:[opeator]}\] - %{NUMBER:[system_code]:int} - %{DATA:[system_msg]} - %{DATA:[system_payload]} - %{GREEDYDATA:[system_data]}"] }
            remove_field => "message"
        }
        date {
            match => ["[logdate]", "yyyy-MM-dd'T'HH:mm:ss.SSS"]
            target => "@timestamp"
            remove_field => ["logdate"]
        }
        urldecode {
            all_fields => true
        }
    }
}
output {
    if [fields][service] == "web" {
        # 输出到elasticsearch 索引logstash-web-%{+YYYY.MM.dd}
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "logstash-web-%{+YYYY.MM.dd}"
               manage_template => true
        }
    }
    if [fields][service] == "api-access" {
        # 输出到elasticsearch 索引logstash-api-access-%{+YYYY.MM.dd}
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "logstash-api-access-%{+YYYY.MM.dd}"
               manage_template => true
        }
    }
    if [fields][service] == "api-error" {
        # 输出到elasticsearch 索引logstash-api-error-%{+YYYY.MM.dd}
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "logstash-api-error-%{+YYYY.MM.dd}"
            manage_template => true
        }
    }
    if [fields][service] == "api-info" {
        # 输出到elasticsearch 索引logstash-api-info-%{+YYYY.MM.dd}
        elasticsearch {
            hosts => ["localhost:9200"]
            index => "logstash-api-info-%{+YYYY.MM.dd}"
            manage_template => true
        }
    }
}

5、创建服务

$ cd /usr/lib/systemd/system
$ touch logstash.service
$ vi logstash.service
[Unit]
Description=Logstash Service
After=network.target
[Service]
Type=simple
ExecStart=/home/elk/logstash-6.3.1/bin/logstash -f /home/elk/logstash-6.3.1/config/logstash.conf
Restart=on-failure
[Install]
WantedBy=default.target

设置开机自启动

$ systemctl enable logstash.service
$ systemctl start logstash.service

安装Filebeta

1、选择下载合适的编译版本

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.4.2-linux-x86_64.tar.gz

2、解压文件

tar xzvf filebeat-7.4.2-linux-x86_64.tar.gz

3、查看目录结构

LICENSE.txt
NOTICE.txt
README.md
data
fields.yml
filebeat
filebeat.reference.yml
filebeat.yml
kibana
module
modules.d

4、修改配置文件

$ vi filebeat.yml

filebeat.inputs:
- type: log
  paths:
    - /var/log/nginx/access.log
  fields:
    service: "web"  # 自定义字段,区分类型
output.logstash:
  hosts: ["192.168.31.29:5044"]  #logstash地址

5、创建服务

$ cd /usr/lib/systemd/system
$ touch filebeat.service
$ vi filebeat.service
Description=Filebeat Service
After=network.target
[Service]
Type=simple
ExecStart=/home/filebeat-7.4.2-linux-x86_64/filebeat -e -c /home/filebeat-7.4.2-linux-x86_64/filebeat.yml
Restart=on-failure
[Install]
WantedBy=default.target

设置开机自启动

$ systemctl enable filebeat.service
$ systemctl start filebeat.service

其他服务器上的filebeat的配置类似

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容