Logstash 入门教程 -配置案例

转自:http://corejava2008.iteye.com/blog/2215591

介绍一个详细案例,讲述如何配置读取Apache日志,Syslog并根据自定义条件进行过滤和输出。

手工输入并解析数据

LS中可以通过Filter针对数据进行切片切块等操作,解析,装换,组装等等。。

Java代码   收藏代码
  1. input { stdin { } } #控制台输入  
  2.   
  3. filter {  
  4.   grok { #通过GROK来自动解析APACHE日志格式  
  5.     match => { "message" => "%{COMBINEDAPACHELOG}" }  
  6.   }  
  7.   date {#通过Date过滤器来自动识别日期格式。  
  8.     match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]  
  9.   }  
  10. }  
  11.   
  12. output {  
  13.   elasticsearch { host => localhost } #输出到ES中。  
  14.   stdout { codec => rubydebug } #输出到控制台  
  15. }  

启动LS:bin/logstash -f logstash-filter.conf

并在控制台输入:

Java代码   收藏代码
  1. 127.0.0.1 - - [11/Dec/2013:00:01:45 -0800"GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"  

 可以看到输出结果为:

Java代码   收藏代码
  1. {  
  2.         "message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"",  
  3.      "@timestamp" => "2013-12-11T08:01:45.000Z",  
  4.        "@version" => "1",  
  5.            "host" => "cadenza",  
  6.        "clientip" => "127.0.0.1",  
  7.           "ident" => "-",  
  8.            "auth" => "-",  
  9.       "timestamp" => "11/Dec/2013:00:01:45 -0800",  
  10.            "verb" => "GET",  
  11.         "request" => "/xampp/status.php",  
  12.     "httpversion" => "1.1",  
  13.        "response" => "200",  
  14.           "bytes" => "3891",  
  15.        "referrer" => "\"http://cadenza/xampp/navi.php\"",  
  16.           "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\""  
  17. }  

 看到结果了吧,完成了两个操作

1.LS使用grok自动解析了日志格式,

2.针对timestamp进行Date格式识别,并复制给了@timestamp字段。

 

再进一步,从文件中输入并解析数据

Java代码   收藏代码
  1. input {  
  2.   file { #通过Input配置,从文件中读取数据。  
  3.     path => "/tmp/access_log"  #日志文件位置  
  4.     start_position => "beginning"   
  5.     #是否从头部开始读取。  
  6.     #Logstash启动后,会在系统中记录一个隐藏文件,记录处理过的行号,  
  7.     #当进行挂掉,重新启动后,根据该行号记录续读。  
  8.     #所以start_position只会生效一次。  
  9.   }  
  10. }  
  11.   
  12. filter {  
  13.   if [path] =~ "access" {#当路径包含access时,才会执行以下处理逻辑  
  14.     mutate { replace => { "type" => "apache_access" } }  
  15.     grok {  
  16.       match => { "message" => "%{COMBINEDAPACHELOG}" }  
  17.     }  
  18.   }else if [path] =~ "error" { #IF-ElSE 配置方式。  
  19.     mutate { replace => { type => "apache_error" } }  
  20.     #使用Mutate 替换type的值为“apache_error”  
  21.   } else {  
  22.     mutate { replace => { type => "random_logs" } }  
  23.   }  
  24.   date {  
  25.     match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]  
  26.   }  
  27. }  
  28.   
  29. output {  
  30.   elasticsearch {  
  31.     host => localhost  
  32.   }  
  33.   stdout { codec => rubydebug }  
  34. }  

 

再来看个案例:

Java代码   收藏代码
  1. output {  
  2.   if [type] == "apache" {  
  3.     if [status] =~ /^5\d\d/ { #如果status状态为5xx,发送给nagios。  
  4.       nagios { ...  }  
  5.     } else if [status] =~ /^4\d\d/ {#如果是4xx,发送到elasticSearch  
  6.       elasticsearch { ... }  
  7.     }  
  8.     statsd { increment => "apache.%{status}" } #所有数据给statsd  
  9.   }  
  10. }  

 处理SysLog案例:

Java代码   收藏代码
  1. 处理SysLog案例:  
  2. input {  
  3.   tcp {  
  4.     port => 5000   #读取TCP端口  
  5.     type => syslog #数据类型  
  6.   }  
  7.   udp {  
  8.     port => 5000   #读取UDP端口  
  9.     type => syslog #数据类型  
  10.   }  
  11. }  
  12.   
  13. filter {  
  14.   if [type] == "syslog" {  
  15.     grok { #解析日志格式。  
  16.       match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }  
  17.       add_field => [ "received_at""%{@timestamp}" ] #添加字段   
  18.       add_field => [ "received_from""%{host}" ]     #添加字段  
  19.     }  
  20.     syslog_pri { }  
  21.     date {  #日期格式处理,这里匹配了两种不同的日期格式。  
  22.       match => [ "syslog_timestamp""MMM  d HH:mm:ss""MMM dd HH:mm:ss" ]  
  23.     }  
  24.   }  
  25. }  
  26.   
  27. output { #数据输出。  
  28.   elasticsearch { host => localhost }  
  29.   stdout { codec => rubydebug }  
  30. }  

 

启动服务:

bin/logstash -f logstash-syslog.conf

发送测试数据:

Java代码   收藏代码
  1. telnet localhost 5000  
  2. Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]  
  3. Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied  
  4. Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)  
  5. Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.  

 查看结果:

Java代码   收藏代码
  1. {  
  2.                  "message" => "Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",  
  3.               "@timestamp" => "2013-12-23T22:30:01.000Z",  
  4.                 "@version" => "1",  
  5.                     "type" => "syslog",  
  6.                     "host" => "0:0:0:0:0:0:0:1:52617",  
  7.         "syslog_timestamp" => "Dec 23 14:30:01",  
  8.          "syslog_hostname" => "louis",  
  9.           "syslog_program" => "CRON",  
  10.               "syslog_pid" => "619",  
  11.           "syslog_message" => "(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",  
  12.              "received_at" => "2013-12-23 22:49:22 UTC",  
  13.            "received_from" => "0:0:0:0:0:0:0:1:52617",  
  14.     "syslog_severity_code" => 5,  
  15.     "syslog_facility_code" => 1,  
  16.          "syslog_facility" => "user-level",  
  17.          "syslog_severity" => "notice"  
  18. }  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值