logstash收集日志到elasticsearch

Logstash是一个具有实时管道功能的开源数据收集引擎。Logstash可以动态地统一来自不同数据源的数据,并将数据规范化为您选择的目标。为各种高级下游分析和可视化用例净化和民主化所有数据。
虽然Logstash最初推动了日志收集方面的创新,但它的功能远远超出了用例。任何类型的事件都可以通过大量的输入、过滤器和输出插件进行丰富和转换,许多本机编解码器进一步简化了摄入过程。Logstash通过利用更大的容量和各种数据来加速您的洞察力。

logstash收集日志到elasticsearch_第1张图片

logstash可以将文档、数据库等非结构化数据进行结构化处理。

管道

logstash收集日志到elasticsearch_第2张图片

logstash管道可以由一个或多个input filter output组成。其中filter是非必须的。

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}

input filter output区域可以包含子区域,如

input {
    file {
        path => "/path/to/logstash-tutorial.log"
        start_position => beginning 
        ignore_older => 0 
    }
}

file默认会以类似UNIX系统中tail -f命令的方式运行,即仅输入最新数据,可使用start_position进行调节;默认会忽略1天未更新的文件,可使用ignore_older调节。

收集nginx访问日志到elasticsearch

以下是我的配置文件nginx_access_log.conf

input {
  file {
    path => "/var/log/httpd/api_access_log"             
    type => "api_nginxaccess"           
    tags => "api.jiayuan.com"
  }
  file {
    path => "/var/log/httpd/napi_access_log"            
    type => "napi_nginxaccess"          
    tags => "napi.jiayuan.com"
  }
}

filter {
  grok {
    #引入自定义pattern目录,默认pattern目录会一直被引用(在我的系统上是/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.2/patterns目录),里面提供很多实用变量
    patterns_dir => "/var/crontab/patterns"
    match => {
      "message" => "%{IPORHOSTORNULL:clientip}%{X_FORWARDED_FOR:x_forwarded_for} %{IPORHOSTORNULL:ip_source} %{HTTPDUSER:remote_user} \[%{HTTPDATE:time_local}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{INT:status:int} %{INT:body_bytes_send:int} \"%{DATA:referer}\" \"%{DATA:user_agent}\" \"%{DATA:cookie}\" \"%{DATA:cookie2}\" \"%{DATA:cookie3}\" \"%{NUMBER:request_time:float}\""
    }
    #message中含有完整的行,分隔后各变量组合起来也是一个message,也就是说行被存储了2遍,使用overwrite来规避这种情况
    overwrite => ["message"]
  }
  #@timestamp是必须的字段,用以标示事件事件,使用date将@timestamp的时间修改为日志中的时间
  date {
    match => ["time_local", "dd/MMM/yyyy:HH:mm:ss Z"]
  }
}

output {

  #当有多个配置文件时,output会将所有符合条件的事件输出出来,所以这里加了if判断。
  #比如a.conf定义了nginx_error的input file,这里不做if判断,做nginx_error的日志也会输出到es集群中。
  #if [type] == "api_nginxaccess" or [type] == "napi_nginxaccess" {
  #  stdout{
  #    codec => rubydebug
  #  }
  #}
  if [type] == "api_nginxaccess" or [type] == "napi_nginxaccess" {
    elasticsearch {
      hosts => ["10.2.1.105:9200", "10.2.1.109:9200", "10.2.1.57:9200"]
      index => "logstash-%{type}-%{+YYYY.MM.dd}"
      document_type => "%{type}"
      template_overwrite => true
    }
  }
}

/var/crontab/patterns/nginx_logstash_pattern内容如下

X_FORWARDED_FOR (?:,%{SPACE}%{IPORHOST})*
IPORHOSTORNULL (?:%{IPORHOST}|-)
# /opt/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_access_log.conf -t  # 检查配置文件
# service logstash restart

完成后可以在kibana中搜索下tags: "_grokparsefailure"来确认正则表达式一切正常。若存在_grokparsefailure证明有正则解析错误。

logstash收集日志到elasticsearch_第3张图片
logstash收集日志到elasticsearch_第4张图片

参考:

elastic的官方文档非常完善,感谢。

https://www.elastic.co/guide/en/logstash/2.2/logstash-reference.html
配置文件语法,必看:https://www.elastic.co/guide/en/logstash/2.2/configuration-file-structure.html

大神的中文翻译,感谢。

http://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html

你可能感兴趣的:(elk)