一、架构图:

ELK收集nginx日志_nginx

二、日志收集方式:

ELK收集日志常用的有两种方式,分别是:
(1)不修改源日志的格式,而是通过logstash的grok方式进行过滤、清洗,将原始无规则的日志转换为规则的日志。
(2)修改源日志输出格式,按照需要的日志格式输出规则日志,logstash只负责日志的收集和传输,不对日志做任何的过滤清洗。
这两种方式各有优缺点:
第一种方式不用修改原始日志输出格式,直接通过logstash的grok方式进行过滤分析,好处是对线上业务系统无任何影响,缺点是logstash的grok方式在高压力情况下会成为性能瓶颈,如果要分析的日志量超大时,日志过滤分析可能阻塞正常的日志输出。因此,在使用logstash时,能不用grok的,尽量不使用grok过滤功能。
第二种方式缺点是需要事先定义好日志的输出格式,这可能有一定工作量,但优点更明显,因为已经定义好了需要的日志输出格式,logstash只负责日志的收集和传输,这样就大大减轻了logstash的负担,可以更高效的收集和传输日志。另外,目前常见的web服务器,例如apache、nginx等都支持自定义日志输出格式。因此,在企业实际应用中,第二种方式是首选方案。

三、配置filebeat

filebeat是安装在Nginx服务器上:

filebeat.inputs:
  - type: log
  enabled: true
  paths:
  - /var/log/nginx/access.log
  fields:
  log_topic: nginxlogs
  filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
  name: 172.16.213.157
  output.kafka:
  enabled: true
  hosts: ["172.16.213.51:9092", "172.16.213.75:9092", "172.16.213.109:9092"]
  version: "0.10"
  topic: '%{[fields.log_topic]}'
  partition.round_robin:
  reachable_only: true
  worker: 2
  required_acks: 1
  compression: gzip
  max_message_bytes: 10000000
  logging.level: debug
  这个配置文件中,是将Nginx的访问日志/var/log/nginx/access.log内容实时的发送到kafka集群topic为nginxlogs中。需要注意的是filebeat输出日志到kafka中配置文件的写法。
  配置完成后,启动filebeat即可:
  [root@filebeatserver ~]# cd /usr/local/filebeat
  [root@filebeatserver filebeat]# nohup ./filebeat -e -c filebeat.yml &
  启动完成后,可查看filebeat的启动日志,观察启动是否正常。

 

四、配置logstash

由于在Nginx输出日志中已经定义好了日志格式,因此在logstash中就不需要对日志进行过滤和分析操作了,下面直接给出logstash事件配置文件kafka_nginx_into_es.conf的内容:

input {
  kafka {
  bootstrap_servers => "172.16.213.51:9092,172.16.213.75:9092,172.16.213.109:9092"
  topics =>"nginxlogs" #指定输入源中需要从哪个topic中读取数据,这里会自动新建一个名为nginxlogs的topic
  group_id => "logstash"
  codec => json {
  charset => "UTF-8"
  }
  add_field => { "[@metadata][myid]" => "nginxaccess-log" } #增加一个字段,用于标识和判断,在output输出中会用到。
  }
  }
   
  filter {
  if [@metadata][myid] == "nginxaccess-log" {
  mutate {
  gsub => ["message", "\\x", "\\\x"] #这里的message就是message字段,也就是日志的内容。这个插件的作用是将message字段内容中UTF-8单字节编码做替换处理,这是为了应对URL有中文出现的情况。
  }
  if ( 'method":"HEAD' in [message] ) { #如果message字段中有HEAD请求,就删除此条信息。
  drop {}
  }
  json {
  source => "message"
  remove_field => "prospector"
  remove_field => "beat"
  remove_field => "source"
  remove_field => "input"
  remove_field => "offset"
  remove_field => "fields"
  remove_field => "host"
  remove_field => "@version“
  remove_field => "message"
  }
  }
  }
  output {
  if [@metadata][myid] == "nginxaccess-log" {
  elasticsearch {
  hosts => ["172.16.213.37:9200","172.16.213.77:9200","172.16.213.78:9200"]
  index => "logstash_nginxlogs-%{+YYYY.MM.dd}" #指定Nginx日志在elasticsearch中索引的名称,这个名称会在Kibana中用到。索引的名称推荐以logstash开头,后面跟上索引标识和时间。
  }
  }
  }

这个logstash事件配置文件非常简单,没对日志格式或逻辑做任何特殊处理,由于整个配置文件跟elk收集apache日志的配置文件基本相同,因此不再做过多介绍。所有配置完成后,就可以启动logstash了,执行如下命令:
[root@logstashserver ~]# cd /usr/local/logstash
[root@logstashserver logstash]# nohup bin/logstash -f kafka_nginx_into_es.conf &
logstash启动后,可以通过查看logstash日志,观察是否启动正常,如果启动失败,会在日志中有启动失败提示。

五、配置Kibana

Filebeat从nginx上收集数据到kafka,然后logstash从kafka拉取数据,如果数据能够正确发送到elasticsearch,我们就可以在Kibana中配置索引了。

登录Kibana,首先配置一个index_pattern,点击kibana左侧导航中的Management菜单,然后选择右侧的Index Patterns按钮,最后点击左上角的Create index pattern,开始创建一个index pattern,如下图所示:

ELK收集nginx日志_ES_02

ELK收集nginx日志_ES_03

ELK收集nginx日志_nginx_04

至此,ELK收集Nginx日志的配置工作完成