elk+filebeat的安装 并 分析nginx日志(推荐)

关于elk及其相关组件的介绍,参看此文https://boke.wsfnk.com/archives/67.html
系统规划
服务类型 OS版本 IP地址 主机名
elk端 centos7.4 192.168.1.26 elk-server
log端 centos7.4 192.168.1.40 boke-host

在elk端安装三大组件

    #添加官方的源
    vi /etc/yum.repos.d/elk6.repo

[elastic-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

    #安装基础组件(清除/重建)(升级系统)(安装elk端相关组件)
    yum install tree wget bash-c* epel* -y  
    yum clean ; yum makecache
    yum update -y ; init 6
    yum install java-1.8.0-openjdk kibana logstash elasticsearch -y

配置elasticsearch

    #修改配置文件
    vi /etc/elasticsearch/elasticsearch.yml

cluster.name: my-application    #配置集群名称,无论是否计划建立集群,建议配置一个名称
#node.name: node-1              #该elasticsearch节点的名称,如果需要建立集群,该节点名称不可重复!!!
network.host: localhost         #只允许本机访问
node.name: elk-server           #本节点叫什么名字(若是集群才能体现价值)
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

    #启动
    systemctl start elasticsearch.service
    systemctl enable elasticsearch.service

    #检查
[root@elk-server ~]# curl http://localhost:9200
{
  "name" : "elk-server",
  "cluster_name" : "my-application",
  "cluster_uuid" : "KiYwI_OsS5mvqxMyeqTKoQ",
  "version" : {
    "number" : "6.1.3",
    "build_hash" : "af51318",
    "build_date" : "2018-01-26T18:22:55.523Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

配置kibana

    #修改配置文件
    vi /etc/kibana/kibana.yml

server.host: "localhost"    #仅本地可访问
elasticsearch.url: "http://localhost:9200"  

    #启动
    systemctl start kibana.service
    systemctl enable kibana.service

    #防火墙配置
    systemctl stop firewalld

    #验证,浏览器访问
    http://192.168.1.26:5601

配置logstash

    #logstash的配置文件完全不需要修改:
    vi /etc/logstash/logstash.yml

path.data: /var/lib/logstash    #logstash数据存储路径,保持默认即可
path.config: /etc/logstash/conf.d/*.conf    #logstash动态加载的配置文件,所有自定义的输入、输出和过滤配置都放置在这个目录中并以.conf结尾
path.logs: /var/log/logstash    #logstash日志文件路径,保持默认即可

    #验证logstash是否能正常工作
        #一会儿后在屏幕中,输入点东西看输出
    /usr/share/logstash/bin/logstash -e 'input {stdin {}} output {stdout{}}'


    #查看logstash的主配置文件
    ll -alh /etc/logstash/

    #查看logstash可执行文件路径
    ll -alh /usr/share/logstash/

logstash与filebeat联合调试

#第一A:编辑logstash的测试配置文件
cat 00-input-5044.conf
input {
  beats {
    port => 5044
  }
}
output {
  stdout {
   codec => rubydebug { }
  }
}

#第一B:运行logstash
/usr/share/logstash/bin/logstash -f 00-input-5044.conf

#第二A:编辑filebeat测试配置文件
cat /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /web-boke/applog/nginx/access.log
  tags: ["wsfnk-nginx-access"]

output.logstash:
  hosts: ["192.168.1.10:5044"]

#第二B:运行filebeat 
filebeat -e -c /etc/filebeat/filebeat.yml -d "Publish"

logstash输入配置/过滤配置/输出配置(下面是关于nginx的访问日志的,输入,过滤,输出的规则)

    #在启动之前需要先编写输入、过滤、输出的相关配置文件,以下是我常用的一些配置文件,不同类型的配置文件可加上数字前缀,以便区分:

[root@elk-server conf.d]# ll /etc/logstash/conf.d/
总用量 20
-rw-r--r--. 1 root root 2280 2月   4 00:46 00-filter-wsfnk-nginx-access-5044.conf
-rw-r--r--. 1 root root   59 2月   3 06:55 00-input-5044.conf
-rw-r--r--. 1 root root  157 2月   4 00:49 90-output-wsfnk-nginx-access-5044.conf


[root@elk-server conf.d]# cat 00-input-5044.conf
input {
  beats {
    port => 5044
    #codec => json   #由于可能多种日志格式不一样,所以不在此处进行格式过滤
  }
}


[root@elk-server conf.d]# cat 00-filter-wsfnk-nginx-access-5044.conf 
filter {
  if [type] == "wsfnk-nginx-access" {

###-----由于我的博客nginx的日志格式是设置为json的---所以需要先用json插件处理
    json {  
        #log端filebeat发送的数据主体信息,标识为"message"
            source => "message"
        #处理完成后可以删除"message"字段,因为已经交给下面的其他步骤进一步处理了
            remove_field => ["message"]  
    }

###----#下面是处理日志中upstreamtime的信息,由于mutate插件中split与convert存在默认的先后执行顺序
    #所以要分开写,迫使先执行分割"split",在转换"convert"
    mutate {
        split => [ "upstreamtime", "," ]
    }
    mutate {
            convert => [ "upstreamtime", "float" ]
    }

###-----------分析经过CDN后,记录到的真实客户端IP归属信息-----###
    geoip {
        source => "http_x_forwarded_for"

    #geoip,输出参数较多,用fields保留需要的字段, "latitude", "longitude"(location能代替前面两个)
        fields => ["ip", "country_name", "region_name", "city_name", "timezone", "country_code2", "continent_code", "location"]
    }

###----------------分析客户端信息----------------###
    #使用logstash-filter-useragent插件来分析日志中nginx日志中的"http_user_agent"字段的客户端信息,系统类别,版本,浏览器等等

    #先判断[user_agent] 是不为空的,才执行下面的过滤,[user_agent]这个字段不能改动,是插件内设置的,下面的source才是你nginx关于客户端的记录变量名
    if [user_agent] != "-" {
        useragent {
            #为http_user_agent分析后的信息,打上(browser)浏览器的标记
            target => "browser"
            source => "http_user_agent"
            #删除一些不太准确的字段,注意,下面是表示删除browser下面的"minor, build, os, os_minor"字段
            #剩下的name: 浏览器的类别,  major: 浏览器版本, os_name: 设备类别(什么系统), os_major: 系统版本
            remove_field => ["[browser][minor]", "[browser][build]", "[browser][os]", "[browser][os_minor]"]

            #这个客户端浏览器标识已经使用完了,可以删除,也可以不删除,我这里就删除了
            remove_field => ["http_user_agent"]
        }
    }

    mutate {
        #删除filebeat自动添加的字段(有"tags", "beat"等,其中beat字段下又有"version","name","hostname"等字段,
        #某些版本的filebeat还会附带"prospector"字段)
        #"host"字段也是beat自动添加的,避免重复数据,将"[host]"删除,保留"[beat][hostname]"
        remove_field => ["tags", "[beat][name]", "[host]"] 
    }
  }
}


[root@elk-server conf.d]# cat 90-output-wsfnk-nginx-access-5044.conf 
output {
  #先进行判断,是为了在有多个输入时,不让其出现重复数据
  if [type] == "wsfnk-nginx-access" {
    elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "wsfnk-nginx-access-%{+YYYY.MM.dd}"
    }
  }
}

    #启动logstash
    systemctl start logstash

    #过一会儿,查看(5044端口有起来没)
    ss -tnl |grep 5044

log端配置nginx日志格式配置

由于我的博客前端用来CDN,所以我将nginx日志格式调整为如下

    log_format json '{ "@timestamp": "$time_iso8601", '
                  #'"server_host":"$server_addr",'
          #直接将服务器的ip写在这儿,防止用变量出去linux内核
                  '"server_addr":"192.168.1.40",'
                  '"http_host":"$http_host",'
                  '"nginx_version":"$nginx_version",'
                  '"cdn_ip":"$remote_addr",'
                  '"remote_user":"$remote_user",'
                  '"request":"$request",'
                  '"request_method":"$request_method",'
                  '"http_user_agent":"$http_user_agent",'
                  '"size":$body_bytes_sent,'
                  '"responsetime":$request_time,'
                  '"upstreamtime":"$upstream_response_time",'
                  '"upstreamhost":"$upstream_addr",'
                  '"url":"$uri",'
                  '"http_x_forwarded_for":"$http_x_forwarded_for",'
                  '"referer":"$http_referer",'
                  '"scheme":"$scheme",'
                  '"server_protocol":"$server_protocol",'
                  '"status":"$status"}';

    access_log  /var/log/nginx/access.log  json;


log端配置filebeat配置
    #filebeat安装
    配置yum源(选择版本号为5的,因为版本6的document_type字段好像不能使用了)
    vi /etc/yum.repos.d/filebeat.repo

[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

    yum install filebeat -y

    vi /etc/filebeat/filebeat.yml

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/nginx/access.log
  document_type: wsfnk-nginx-access
#------------ Logstash output -----------------
output.logstash:
  # The Logstash hosts
  hosts: ["223.84.153.80:5044"]

    #启动
    systemctl start filebeat
    systemctl enable filebeat

附:nginx access访问日志各个可用参数变量表

nginx访问日志变量

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/464.html

最后编辑于:2020/1/15作者: 辣条①号

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注