logstash 学习小记

logstash 学习小记

标签(空格分隔): 日志收集


Introduce

Logstash is a tool for managing events and logs. You can use it to collect logs, parse them, and store them for

later use (like, for searching). – http://logstash.net

自从2013年logstash被ES公司收购之后,ELK stask正式称为官方用语。非常多公司都開始ELK实践。我们也不例外,借用新浪是怎样分析处理32亿条实时日志的?的一张图

这是一个再常见只是的架构了:

(1)Kafka:接收用户日志的消息队列。

(2)Logstash:做日志解析,统一成JSON输出给Elasticsearch。

(3)Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务。通过index组织数据,兼具强大的搜索和统计功能。

(4)Kibana:基于Elasticsearch的数据可视化组件。超强的数据可视化能力是众多公司选择ELK stack的重要原因。

可是众多log 收集framwork,像flume,scribe。fluent,为什么选用logstash呢?

原因非常简单:

  1. 部署启动非常easy。仅仅须要有jdk就OK了
  2. 配置简单,无需编码
  3. 支持收集log路径的正則表達式,不像flume那样必须写死要收集的文件名称。logstash不是,像这样

    path => [“/var/log/.log“]

    有个Flume VS Fluentd VS Logstash能够看看

Logstash Examples

logstash事件处理流程氛围三个stages:input ,filter,output。input支持非常多。如file。redis,kafka等等,filter主要是对input的log进行自己想要的处理,output则是输出到你要存储log的第三方framework。如kafka,redis,elasticsearch。db什么的。详细的查看官网。

废话不多说,開始样例:

1. 最最简单的样例

input和output都是标准输入输出

[joeywen@192 logstash]$ bin/logstash -e ‘input { stdin { } } output { stdout {}}‘

Logstash startup completed
>hello world  ## 输入的内容
>2015-08-02T05:26:55.564Z joeywens-MacBook-Pro.local hello world   ## logstash收集的内容
  1. 编写config文件
input {
  file {
    path => ["/var/log/*.log"]
    type => "syslog"
  }
}

output {
  stdout {  codec => rubydebug }
  #  elasticsearch {
  #      host => ‘localhost‘
  #      protocol => ‘transport‘
  #      cluster => ‘elasticsearch‘
 #       index => ‘logstash-joeymac-%{+YYYY.MM.dd}‘
 #   }
}

输入是file形式,收集系统日志,假设有异常发生,通常异常会多行,这里用codec => multiline 来对出现异常的多行转换为一行输入

输出就是ES。或者你也能够把stdout作为调试打开看看,输出的是什么内容。执行命令例如以下以及输出

[[email protected]192 logstash]$ bin/logstash -f sys.conf
Logstash startup completed

{
    "@timestamp" => "2015-08-02T05:36:08.972Z",
       "message" => "Aug  2 13:36:08 joeywens-MacBook-Pro.local GoogleSoftwareUpdateAgent[1976]: 2015-08-02 13:34:51.764 GoogleSoftwareUpdateAgent[1976/0xb029b000] [lvl=2] -[KSUpdateEngine(PrivateMethods) updateFinish] KSUpdateEngine update processing complete.",
      "@version" => "1",
          "host" => "joeywens-MacBook-Pro.local",
          "path" => "/var/log/system.log",
          "type" => "syslog"
}
{
    "@timestamp" => "2015-08-02T05:36:08.973Z",
       "message" => "Aug  2 13:36:08 joeywens-MacBook-Pro.local GoogleSoftwareUpdateAgent[1976]: 2015-08-02 13:36:08.105 GoogleSoftwareUpdateAgent[1976/0xb029b000] [lvl=3] -[KSAgentUploader fetcher:failedWithError:] Failed to upload stats to <NSMutableURLRequest https://tools.google.com/service/update2> with error Error Domain=NSURLErrorDomain Code=-1001 \"The request timed out.\" UserInfo=0x3605f0 {NSErrorFailingURLStringKey=https://tools.google.com/service/update2, _kCFStreamErrorCodeKey=60, NSErrorFailingURLKey=https://tools.google.com/service/update2, NSLocalizedDescription=The request timed out., _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x35fd30 \"The request timed out.\"}",
      "@version" => "1",
          "host" => "joeywens-MacBook-Pro.local",
          "path" => "/var/log/system.log",
          "type" => "syslog"
}
{
    "@timestamp" => "2015-08-02T05:36:08.973Z",
       "message" => "Aug  2 13:36:08 joeywens-MacBook-Pro.local GoogleSoftwareUpdateAgent[1976]: 2015-08-02 13:36:08.272 GoogleSoftwareUpdateAgent[1976/0xb029b000] [lvl=3] -[KSAgentApp uploadStats:] Failed to upload stats <KSStatsCollection:0x4323e0 path=\"/Users/joeywen/Library/Google/GoogleSoftwareUpdate/Stats/Keystone.stats\", count=6, stats={",
      "@version" => "1",
          "host" => "joeywens-MacBook-Pro.local",
          "path" => "/var/log/system.log",
          "type" => "syslog"
}

假设想加入或删除字段,该怎么办?filter就该登场了

  1. filter

    filter的功能十分强大。能够对input的内容做不论什么更改。input的内容会转换为一个叫event的map,里面存放着key/value对,正如你所示输出一样,@timestamp,type,@version, host,message等等,都是event里面的key,在filter里面你能够启动ruby 编程plugin对其做不论什么更改

    如:

input {
  file {
    path => ["/var/log/*.log"]
    type => "syslog"
  }
}

filter {
    multiline {
      pattern => "(^\d+\serror)|(^.+Exception:.+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Causedby:.+)"
      what => "previous"
    }
    if [type] =~ /^syslog/ {
        ruby {
            code => "file_name = event[‘path‘].split(‘/‘)[-1]
            event[‘file_name‘] = file_name"
        }
    }
}

output {
  stdout {  codec => rubydebug }
 }

如上我对type已syslog开头的event做更改,调用ruby编程

看看输出

[[email protected]192 logstash]$ bin/logstash -f sys.conf
Logstash startup completed
{
    "@timestamp" => "2015-08-02T05:46:52.771Z",
       "message" => "Aug  2 13:46:40 joeywens-MacBook-Pro.local Dock[234]: CGSConnectionByID: 0 is not a valid connection ID.",
      "@version" => "1",
          "host" => "joeywens-MacBook-Pro.local",
          "path" => "/var/log/system.log",
          "type" => "syslog",
     "file_name" => "system.log"
}

能够看到多了个file_name的字段,

假设相对message做解析的话。须要调用grok plugin来做,grok是非常强大插件,比如

input {
  file {
    path => "/var/log/http.log"
  }
}
filter {
  grok {
    patterns_dir => ["/opt/logstash/patterns", "/opt/logstash/extra_patterns"]
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}

对于message字段调用正则匹配,语法是%{SYNTAX:SEMANTIC}

第一个SYNTAX是正則表達式名称,第二个是对于匹配成功的字段取名字,这些SYNTAX存在指定的pattern_dir文件夹下的文件,格式是:

NAME PATTERN

如 NUMBER \d+

也能够使用mutate来最event的key和value做更改。包含remove,add,update,rename 等等。详细的都能够看看(logstash文档)[https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html]

这里给个详细的样例吧

配置:

input {
  file {
    path => ["/var/log/*.log"]
    type => "syslog"

  }
}

filter {
    multiline {
      pattern => "(^\d+\serror)|(^.+Exception:.+)|(^\s+at .+)|(^\s+... \d+ more)|(^\s*Causedby:.+)"
      what => "previous"
    }
    if [type] =~ /^syslog/ {
        ruby {
            code => "file_name = event[‘path‘].split(‘/‘)[-1]
            event[‘file_name‘] = file_name"
        }
        grok {
            patterns_dir => ["./patterns/*"]
            match => {"message" => "%{MAC_BOOK:joeymac}"}
        }

        mutate {
            rename => {"file_name" => "fileName"}
            add_field => {"foo_%{joeymac}" => "Hello world, from %{host}"}
        }
    }
}

output {
  stdout {  codec => rubydebug }
 }

输出

[[email protected]192 logstash]$ bin/logstash -f sys.conf
Logstash startup completed
{
                  "@timestamp" => "2015-08-02T06:10:13.161Z",
                     "message" => "Aug  2 14:10:12 joeywens-MacBook-Pro com.apple.xpc.launchd[1] (com.apple.quicklook[2206]): Endpoint has been activated through legacy launch(3) APIs. Please switch to XPC or bootstrap_check_in(): com.apple.quicklook",
                    "@version" => "1",
                        "host" => "joeywens-MacBook-Pro.local",
                        "path" => "/var/log/system.log",
                        "type" => "syslog",
                     "joeymac" => "joeywens-MacBook-Pro",
                    "fileName" => "system.log",
    "foo_joeywens-MacBook-Pro" => "Hello world, from joeywens-MacBook-Pro.local"
}

转载请注明出处

时间: 2024-08-24 11:08:28

logstash 学习小记的相关文章

git 学习小记之记住https方式推送密码

昨天刚刚学了点git基础操作,但是不幸的是[email protected]给出公告说尽量使用 https 进行操作.可是在用 https 进行 push 时,都需要输入帐号和密码. 各种百度谷歌之后在[email protected]官网找到了解决方法<https方式使用[email protected]设置密码的方式>文中给出了几个方法,并且都非常简单. 关于 cache 缓存方式,我不太喜欢,因为要设置时间,而且会过期.而 store 相应的非常方便,设置全局后,方便多个库使用.当然如果

linux学习小记 (一 )

shell 学习小记: 注意:多看系统脚本  多模仿    su切换用户时需要输入目标用户密码,root(superuser)切换到任何用户都不需要输入密码,- 参数必须要是最后一个(su huhu -) sudo需要输入当前用户密码,拥有sudo特权的用户可以执行 "sudo su -"命令,使用自己的密码切换到root用户 , 所以应该在/etc/sudoers 文件中禁止 sudo 执行su命令 linux文件与颜色: /etc/DIR_COLORS   (命令dircolors

js 正则学习小记之匹配字符串优化篇

昨天在<js 正则学习小记之匹配字符串>谈到 /"(?:\\.|[^"])*"/ 是个不错的表达式,因为可以满足我们的要求,所以这个表达式可用,但不一定是最好的.从性能上来说,他非常糟糕,为什么这么说呢,因为 传统型NFA引擎 遇到分支是从左往右匹配的,所以它会用 \\. 去匹配每一个字符,发现不对后才用 [^"] 去匹配.比如这样一个字符串: "123456\'78\"90"共 16 个字符,除了第一个 " 直接

js 正则学习小记之匹配字符串

原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) var str1 = "我是字符串1哦,快把我取走", str2 = "我是字符串2哦,快把我取走"; 比如这样一个字符串,匹配起来很简单 /"[^"]*"/g 即可. PS: 白色截图是 chrome 3

git 学习小记之图形化界面客户端

习惯了 Windows 的用户,一直不喜欢用类似命令行的东西来操作,当然我也不是不喜欢,只是操作太慢了.也许 Linux 大神在命令行的帮助下,办事效率翻倍,那也是非常常见的事情..当然我不是大神,所以还是得选择一个合适的工具才行. 其实相信大家也是一样,简单学习之后,直接就上工具了..我找到一篇不错的文章<Git图形化界面客户端大汇总>里面介绍了 11 款 git 工具,而且有截图和简单描述,貌似作者按喜好排序的. 我下载了前三个测试了下.TortoiseGit 差不多直接上手,因为我用的

数据库规范——学习小记

数据库规范--学习小记 之前在学习后端开发的时候,在数据库这一块,有关建表与查询效率等方面一直存有疑问,但因为做的项目都很小,不太需要考虑效率与规范,所以想着能实现功能就行.因此最近打算深入了解一些建表的规范以及如何提高查询效率. 表设计规范 命名规范的话,之前倒是都有注意,大致总结为以下几点: 表命名 表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,然后驼峰式命名 表名应该有意义,易于理解,最好使用可以表达功能的英文单词或缩写,如果用英文单词表示,建议使用完整的英文单词 表名最好不

Java基础学习小记--多态

题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓“早起毁一天”不是没有道理哪,特别对Coders来说,有几天不是加班到夜里.好吧,我承认对于初学Java的我,昨日头脑顿路,Java的继承与多态,看得我是有点小懵逼.其实大致是懂了,不过到了具体应用中,特别是比较复杂的继承和调用关系的时候些许迷路.好了,话不多说,明日再把继承和多态来个总结,今日先对多态来个小记. ---------------------------------------------------------

logstash学习2 - logstash中的redis插件

redis作为logstash中的官方broker,既有input插件,还有output插件. redis input插件 data_type属性: 有三种类型, list -> BLPOP --阻塞式列表弹出 channel -> SUBSCRIBE -- 指定订阅者 pattern_channel -> PSUBSCRIBE --多个订阅者,模糊匹配 input插件作为消息队列. 使用pattern_channel input { redis { data_type => &q

Dubbo学习小记

前言 周一入职的新公司,到了公司第一件事自然是要熟悉新公司使用的各种技术,搭建本地的环境. 熟悉新公司技术的过程中,首先就是Maven,这个前面已经写过文章了,然后就是Dubbo----公司的服务都是通过Dubbo来治理的.其实之前我就对SOA.RPC等分布式服务的概念有所了解,Dubbo也多多少少知道一些,不过能亲身使用那是再好不过的了. 此文就对我的Dubbo学习做一个小的总结,基本我总结的这些内容对于入门应该是足够了.关于Dubbo的更详细信息,阿里有专门出手册,手册地址为http://d