操作系统 17

配置优化,7单机部署ELK

1、nginx日志格式

log_format配置如下:

log_format  main  '$remote_addr $remote_user [$time_local] $http_host $request_method $request_uri  '
        '$status $body_bytes_sent $request_time "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for "$http_cookie"'

nginx也可以添加json日志格式

# vim /usr/local/nginx/conf/nginx.conf
log_format json '{"@timestamp":"$time_iso8601",'
                  '"host":"$server_addr",'
                  '"clientip":"$remote_addr",'
                  '"remote_user":"$remote_user",'
                  '"request":"$request",'
                  '"http_user_agent":"$http_user_agent",'
                  '"size":$body_bytes_sent,'
                  '"responsetime":$request_time,'
                  '"upstreamtime":"$upstream_response_time",'
                  '"upstreamhost":"$upstream_addr",'
                  '"http_host":"$host",'
                  '"url":"$uri",'
                  '"domain":"$host",'
                  '"xff":"$http_x_forwarded_for",'
                  '"referer":"$http_referer",'
                  '"status":"$status"}';
access_log /var/log/nginx/access.log json;

对应的日志如下:

183.56.162.88 - [21/Dec/2017:10:36:29 +0800] wxself.gtafe.com GET /Home/Index/?returnUrl=/pages/index.html&code=G28ea0iAaAmxsFcAcy1y64fIP9I07SUgOEopckpsZF4&state=sure 302 134 0.229 "-" "Mozilla/5.0 (Linux; Android 7.0; BLN-AL40 Build/HONORBLN-AL40; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 
TBS/043613 Safari/537.36 wxwork/2.4.1 MicroMessenger/6.3.22 NetType/WIFI Language/zh" - "ASP.NET_SessionId=ci1ivt21p2zzfsaisode3xvj"

1、nginx日志

nginx 日志格式如下:

log_format  main  '$http_x_forwarded_for - $upstream_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" $request_time';

对应日志如下:

124.126.207.105 - 127.0.0.1:31002 - - [22/Nov/2017:16:56:31 +0800] "POST /weChatShare/share HTTP/1.0" 200 289 "http://wechat.xxx.com/buy/drug?categoryId=27" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_1 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Mobile/15B93 MicroMessenger/6.5.19 NetType/WIFI Language/zh_CN" 0.004
- - 127.0.0.1:30002 - - [22/Nov/2017:16:56:31 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" 0.019

1.2 场景分析

  日志主要包括系统日志、应用程序日志和安全日志等等。运维人员和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

  通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。

  集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

  这里采用开源实时日志分析ELK平台能够完美的解决我们上述的问题,当然也还有别的平台或者工具可以使用,这里只讨论ELK,官方网站:https://www.elastic.co

本文采用grok过滤器,使用match正则表达式解析,根据自己的log_format定制。

操作系统,Elasticsearch-Logstash-Kibana(一)环境搭建
Elasticsearch-Logstash-Kibana(二)数据可视化
Elasticsearch-Logstash-Kibana(三)配置优化

二、安装Elasticsearch

3、Filebeat配置文件

修改filebeat的配置文件。如果同一台机器上要收集多个日志文件,而且每个日志要输出到不同的索引,那么可以把每个prospector单独定义一个tags,然后在logstash上通过
if 判断输出到不同的索引。

- type: log

  enabled: true

  paths:
    - /gta/nginx_log/www.xxx.com.log

  tags: ["www.xxx.com"]

- type: log

  enabled: true

  paths:
    - /gta/nginx_log/www.yyy.com.log

  tags: ["www.yyy.com"]

优化配置

3.1 安装logstash

# tar -zxvf logstash-5.6.3.tar.gz

# mv logstash-5.6.3 /data/logstash

在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析。

字段格式化

下面是一段nginx日志,里面有一个字段,bytes 传输的字节

124.126.207.105 - 127.0.0.1:31002 - - [22/Nov/2017:16:56:31 +0800] "POST /weChatShare/share HTTP/1.0" 200 289 "http://wechat.xxx.com/buy/drug?categoryId=27" "Mozilla/5.0 (iPhone; CPU iPhone OS 11_1 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Mobile/15B93 MicroMessenger/6.5.19 NetType/WIFI Language/zh_CN" 0.004
- - 127.0.0.1:30002 - - [22/Nov/2017:16:56:31 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" 0.019

5.2 重新配置logstash启动配置文件

  nginx日志格式,根据业务要求,我们这做了一些修改,比如增加cookie等,修改access.log日志时间格式等,这个会在另外的博客中写出来,会给出链接的。

   Nginx日志中添加cookie信息 
http://www.linuxidc.com/Linux/2017-11/148217.htm

  Nginx改变access.log中的时间格式 
http://www.linuxidc.com/Linux/2017-11/148221.htm

   Nginx日志格式  

log_format main

``'[$time_local] - $remote_addr:$remote_port - $upstream_addr $upstream_status $upstream_response_time - '

``'"$request" $status $bytes_sent $request_time '

``'"$http_referer" - "$http_user_agent" - '

``'"$customerTag_cookie" - "$ym_cookie" - "$http_cookie" '

``'"$http_x_forwarded_for"';

 

# 这里只是我们自己的格式,各位可以根据自己要求增删

   grok使用表达式

  可能我理解不是很到位,写的也比较复杂,我会把匹配对应项一一写出来,大家可以自己理解,然后为自己的项目配置

%{SYSLOG5424SD} - %{IPV4:clientip}:%{NUMBER:clientport} - %{IPV4:hostip}:%{NUMBER:itemport} %{INT:upstream_status} %{NUMBER:response_time} - \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{INT:status} %{INT:body_bytes_sent} %{NUMBER:request_time} %{QS:url} - %{QS:user_agent} - %{QS:customerTag} - %{QS:ym_traffic_session_id} - %{QS:all_cookies} %{IPV4:realip}

  grok匹配说明

 
1
%{SYSLOG5424SD}
时间格式
 
1
%{IPV4:clientip}
获取ip,clientip是自己命名的
 
1
%{NUMBER:clientport}
NUMBER匹配数字
 
1
%{INT:upstream_status}
INT整形
 
1
%{WORD:method}
WORD单词
 
1
%{URIPATHPARAM:request}
获取请求内容request
 
1
%{QS:url}
 QS可以获取一段字符串

  修改logstash启动配置文件

input {

``beats {

``port => "5044"

``}

 

}

 

 

filter {

``if [type] == "nginx_access" {

 

``grok {

``match => {"message" => "%{SYSLOG5424SD} - %{IPV4:clientip}:%{NUMBER:clientport} - %{IPV4:hostip}:%{NUMBER:itemport} %{INT:upstream_status} %{NUMBER:response_time} - \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:http_version}\" %{INT:status} %{INT:body_bytes_sent} %{NUMBER:request_time} %{QS:url} - %{QS:user_agent} - %{QS:customerTag} - %{QS:ym_traffic_session_id} - %{QS:all_cookies} %{IPV4:realip}"}

``}

 

 

``mutate {

``remove_field => "message"  # 把message字段去掉,它会将上面单项获取的信息做个汇总,这样就重复了

``}

 

``}

 

}

 

output {

``elasticsearch {

``hosts => "172.16.220.248:9200"

``}

#stdout { codec => rubydebug }

}

  测试一下配置文件

./logstash -t -f ../config/logstash.conf

  操作系统 1

    重启logstash

  不出问题elasticsearch 和kibana中就会有数据了

       
操作系统 2

基于CentOS
6.9搭建ELK环境指南 
http://www.linuxidc.com/Linux/2017-07/145636.htm

Linux日志分析ELK环境搭建 
http://www.linuxidc.com/Linux/2017-07/145494.htm

Logstash 监控日志文件时应对日志文件名改变的原理 
http://www.linuxidc.com/Linux/2016-08/133994.htm

使用Elasticsearch + Logstash + Kibana搭建日志集中分析平台实践 
http://www.linuxidc.com/Linux/2015-12/126587.htm

Linux上安装部署ElasticSearch全程记录 
http://www.linuxidc.com/Linux/2015-09/123241.htm

Elasticsearch安装使用教程
http://www.linuxidc.com/Linux/2015-02/113615.htm

ElasticSearch 配置文件译文解析
http://www.linuxidc.com/Linux/2015-02/114244.htm

ElasticSearch集群搭建实例 
http://www.linuxidc.com/Linux/2015-02/114243.htm

分布式搜索ElasticSearch单机与服务器环境搭建 
http://www.linuxidc.com/Linux/2012-05/60787.htm

ElasticSearch的工作机制 
http://www.linuxidc.com/Linux/2014-11/109922.htm 

CentOS 安装 Logstash 2.2.0 和 Elasticsearch 2.2.0 
 http://www.linuxidc.com/Linux/2016-03/128794.htm

ElasticSearch
的详细介绍
:请点这里
ElasticSearch
的下载地址
:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148222.htm

操作系统 3

4、编写logstash pipeline配置文件

这里通过 if 判断将不同type的日志输出到不同的索引。

input {
    beats {
            port => 5044
    }
}

filter {
    if "www.xxx.com" in [tags] {
        grok {
                match => { "message" => "%{IP:remote_addr} (?:%{DATA:remote_user}|-) \[%{HTTPDATE:timestamp}\] %{IPORHOST:http_host} %{DATA:request_method} %{DATA:request_uri} %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) (?:%{DATA:request_time}|-) \"(?:%{DATA:http_referer}|-)\" \"%{DATA:http_user_agent}\" (?:%{DATA:http_x_forwarded_for}|-) \"(?:%{DATA:http_cookie}|-)\""}
        }
        mutate {
                convert => ["status","integer"]
                convert => ["body_bytes_sent","integer"]
                convert => ["request_time","float"]
        }
        geoip {
                source=>"remote_addr"
        }
        date {
                match => [ "timestamp","dd/MMM/YYYY:HH:mm:ss Z"]
        }
        useragent {
                source=>"http_user_agent"
        }
    }

}

output {
        if "www.xxx.com" in [tags] {
                elasticsearch {
                       hosts => ["10.1.128.101:9200"]
                       index => "www.xxx.com_10.1.144.60"
                       user => 'elastic'
                       password => '123456'
                      }
        }

        stdout { codec => rubydebug }
}

Logstash 监控日志文件时应对日志文件名改变的原理 
http://www.linuxidc.com/Linux/2016-08/133994.htm

Logstash5.4.1解析日志报错处理 
http://www.linuxidc.com/Linux/2017-08/146197.htm

ElasticSearch 和Logstash使用详解 
http://www.linuxidc.com/Linux/2017-12/149343.htm

部署 ELK 日志系统 Elasticsearch+Logstash+Kibana 
http://www.linuxidc.com/Linux/2017-05/143304.htm

排查Logstash2.4升级到5.0版本后Kafka不兼容问题 
http://www.linuxidc.com/Linux/2016-12/138216.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149811.htm

操作系统 4

grok 日志过滤

在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析。

本文采用grok过滤器,使用match正则表达式解析,根据自己的log_format定制。

1.1 介绍

  ELK是三个开源工具组成,简单解释如下:

  Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

  Logstash是一个完全开源的工具,它可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。

Kibana
也是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch
提供的日志分析友好的 Web
界面,可以帮助您汇总、分析和搜索重要数据日志。

2、编写正则表达式

logstash中默认存在一部分正则让我们来使用,可以访问Grok
Debugger来查看,可以在
$logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.0/patterns/
目录里面查看。
基本定义在grok-patterns中,我们可以使用其中的正则,当然并不是所有的都适合nginx字段,这时就需要我们自定义正则,然后通过指定patterns_dir来调用。
同时在写正则的时候可以使用Grok Debugger或者Grok
Comstructor工具来帮助我们更快的调试。在不知道如何使用logstash中的正则的时候也可使用Grok
Debugger的Descover来自动匹配。
Github中也有相关的语法说明:

通过log_format来匹配对应的正则如下:

%{IP:remote_addr} (?:%{DATA:remote_user}|-) \[%{HTTPDATE:timestamp}\] %{IPORHOST:http_host} %{DATA:request_method} %{DATA:request_uri} %{NUMBER:status} (?:%{NUMBER:body_bytes_sent}|-) (?:%{DATA:request_time}|-) \"(?:%{DATA:http_referer}|-)\" \"%{DATA:http_user_agent}\" (?:%{DATA:http_x_forwarded_for}|-) \"(?:%{DATA:http_cookie}|-)\"

message是每段读进来的日志,IPORHOST、USERNAME、HTTPDATE等都是patterns/grok-patterns中定义好的正则格式名称,对照日志进行编写。
grok pattren的语法为:%{SYNTAX:semantic},”:”
前面是grok-pattrens中定义的变量,后面可以自定义变量的名称。(?:%{SYNTAX:semantic}|-)这种形式是条件判断。
如果有双引号””或者中括号[],需要加  进行转义。

2.示例

编辑该字段

操作系统 5

编辑字段![]()

选择 Bytes,然后 Update Field

操作系统 6

选择

验证

操作系统 7

验证

3.3 启动logstash  

  最后新建一个logstash的启动指定test.conf配置文件,内容如下:  

input {

``beats {

``port ``=``> ``"5044"

``}

}

output {

``elasticsearch {

``hosts ``=``> ``"172.16.220.248:9200"

``}

``stdout { codec ``=``> rubydebug }  ``# 这是将输出打印在屏幕上,可以注释掉

}

  Logstash默认有input、filter、output三个区域,一般最少需要配置input和output即可!

  logstash的本身默认的logstash.yml配置文件选择不修改即可!

  简单测试一下logstash不指定配置文件启动

# cd /data/filebeat/bin

# ./logstash -e 'input { stdin {} } output {stdout {} }'

  操作系统 8

  我们手动输入 hello world,它也会输出 hello
world

  指定配置文件启动logstash 

# ./logstash -f ../config/test.conf &

  查看5044端口和9600端口是否开启

  操作系统 9

  等待一会后应该会出现如下信息输出,这也就是test.conf里面最后一行定义输出到屏幕上

  操作系统 10

1.主要步骤

  • 进入Settings 选项卡
  • 在左侧,选择你要格式化的字段所在的索引
  • 然后右侧出来的字段列表,选择你想要的字段进行转换,在最后有一个编辑。这里选择bytes字段
  • 在Format里选择你要格式化的格式,这里选择Bytes,最后点击Update
    Field即可。

 5.1 在nginx服务器上安装filebeat

  服务器:
172.16.200.160  

# tar -zxvf filebeat-5.6.3-linux-x86_64.tar.gz

# mv filebeat-5.6.3-linux-x86_64 /data/filebeat

# cd /data/filebeat

# cp filebeat.yml filebeat.yml.bak

  修改filebeat配置文件

# cat filebeat.yml | grep -v ^$ | grep -v ^# | grep -v "#"

filebeat.prospectors:

- input_type: log

``paths:

``- /data/nginx/logs/160_access.log

``document_type: nginx_access

output.logstash:

``hosts: ["172.16.220.248:5044"]

  启动filebeat

# ./filebeat &

2、编写正则表达式

logstash中默认存在一部分正则让我们来使用,可以访问Grok
Debugger来查看。

基本定义在grok-patterns中,我们可以使用其中的正则,当然并不是所有的都适合nginx字段,这时就需要我们自定义正则,然后通过指定patterns_dir来调用。

同时在写正则的时候可以使用Grok Debugger或者Grok
Comstructor工具来帮助我们更快的调试。在不知道如何使用logstash中的正则的时候也可使用Grok
Debugger的Descover来自动匹配。

logstash自带的grok正则中有nginx的标准日志格式:

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response}  (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent} %{QS:xforwardedfor} %{IPORHOST:host} %{BASE10NUM:request_duration}

我们可以参考这个正则来自定义自己的日志

NGUSERNAME [a-zA-Z\.\@\-\+_%]+
NGUSER %{NGUSERNAME}
UPSTREAM_ADDR (%{IPV4}:%{POSINT}[, ]{0,2})+
NGINXACCESS %{IPV4:http_x_forwarded_for} - %{UPSTREAM_ADDR} \- \- \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{NUMBER:duration}

其中 UPSTREAM_ADDR 是自定义的正则。

启动logstash,然后就可以查看日志是否写入elasticsearch中。

暂时想到这些,以后再慢慢补充吧。

一、 简介

五、获取Nginx access日志

  Nginx日志格式在logstash的grok里面默认是没有的,需要我们手动配置,可以通过
在线工具来判断配置是否正确。

 四、安装kibana 

# tar -zxvf kibana-5.6.3-linux-x86_64.tar.gz

# mv kibana-5.6.3-linux-x86_64 /data/kinbana

# cd /data/kinbana/config/

# cp kibana.yml kibana.yml.bak

  编辑kibana.yml配置文件

# vim kibana.yml

server.port: ``5601

server.host: ``"172.16.220.248"

elasticsearch.url: ``"http://172.16.220.248:9200"

  启动kinbana

# cd /data/kibana/bin

# ./kibana &

  查看端口

  操作系统 11

  浏览器登入查看

   操作系统 12

  点击create按钮后,然后点击上面的discover按钮,注意如果没数据的话,注意看看导入的时间@timestamp和现在的时间对比一下,kibana默认只显示最近15分钟的数据,如果超出15分钟请选择适当的时间,从kibana可以看到messages-log里面的15条数据都正常导入了。这就也完成我们的实现的第一个效果。但是这仅仅是把流程跑通了,接下来我们需要做的事情还有更多。注意只能先导入数据到es后才能在kibana创建索引。

  操作系统 13

3.2 安装filebeat

  下载filebeat并启动,通过它来监听数据源文件的新增内容经过logstash处理后上传到es里面

# tar -zxvf filebeat-5.6.3-linux-x86_64.tar.gz

# mv filebeat-5.6.3-linux-x86_64 /data/filebeat

# cd /data/filebeat

# cp filebeat.yml filebeat.yml.bak

  编辑**filebeat.yml文件**

filebeat.prospectors:

- input_type: log

``paths:

``-
/``var``/``log``/``message``-``log  ``# 测试本机的一个log文件

output.logstash:

``hosts: [``"172.16.220.248:5044"``]

  启动**filebeat服务**

# cd /data/filebeat

# ./filebeat &

  查看启动,filebeat没有监听端口,主要看日志和进程

# tialf logs/filebeat

# ps -ef | grep filebeat

  操作系统 14

  filebeat监听的文件记录信息在/data/filebeat/data/registry

  新建一个本地文件message-log,可以取几条本机系统的messages文件

   操作系统 15

2.1 安装jdk

# java -version

java version ``"1.8.0_121"

Java(TM) SE Runtime Environment (build ``1.8``.``0_121``-``b13)

Java HotSpot(TM) ``64``-``Bit Server VM (build ``25.121``-``b13, mixed mode)

 2.2 安装Elasticsearch

# tar -zxvf elasticsearch-5.6.3.tar.gz

# mv elasticsearch-5.6.3 /data/elasticsearch

# cd elasticsearch/config/

# 备份配置文件

# cp elasticsearch.yml elasticsearch.yml.bak

  编辑配置文件

# cat elasticsearch.yml | grep -v ^#

cluster.name: elk``-``application

node.name: node``-``1

path.data: ``/``data``/``elasticsearch``/``data

path.logs: ``/``data``/``elasticsearch``/``logs

network.host: ``172.16``.``220.248

http.port: ``9200

discovery.zen.ping.unicast.hosts: [``"node-1"``]

discovery.zen.minimum_master_nodes: ``1

  添加elasticsearch用户,不能使用root启动

# groupadd -g 1008 elasticsearch

# useradd -g 1008 -u 1008 elasticsearch

# chown -R elasticsearch:elasticsearch /data/elasticsearch/

  修改sysctl.conf文件

# vim /etc/sysctl.conf

vm.max_map_count ``= 262144

 

# sysctl -p

  修改**/etc/security/limits.conf文件,修改打开文件句柄**

*              soft    nofile          ``100000

*              hard    nofile          ``100000

*              soft    nproc          ``100000

*              hard    nproc          ``100000

  添加hosts文件

# vim /etc/hosts

172.16``.``220.248 node``-``1

  启动

# su -s elasticsearch

# cd /data/elasticsearch/bin

# ./elasticearch &

  查看是否启动

  操作系统 16

  简单的**curl测试**

# curl http://172.16.220.248:9200

  操作系统 17

三、安装Logstash和filebeat

  filebeat用于在各个服务器上获取数据,发送到logstash上,再由logstash处理数据。