logstash学习小记

yxysuanfa yxysuanfa     2022-09-15     570

关键词:

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"
}

转载请注明出处


















vue学习小记

vue中有 data()、computed、methods、beforeRouteLeave、created等具体的:   data():定义一些文件中需要用到的变量,data中带return,是使数据只在当前组件中可用,不会影响其他组件,不使用return,会让数据在全局可见,会造成污染 ... 查看详情

神经网络深度学习学习小记

一、sigmodfunction出现的必要性:  为什么不直接用stagefunction?在feedback时,假如说我们现在用的是stagefunction,直接用楼梯式的跳跃函数,我们每次做很小的参数改动时。如果说这个之前这个参数使函数值落在0-1改变的那一块区... 查看详情

学习小记

近来的学习情况有些枯燥和无聊。我的心里总体感觉就是这样,每天自己看书看到打瞌睡,是不是因为我太懒啦~坐着都会睡着。关键是真的太无聊啦。自己一个人做自己的事情,一个说话的人都米有,明明身边都是人呀,怎么... 查看详情

yarn学习小记

官网:https://yarnpkg.com/zh-Hans/docs/installing-dependencies简介:包管理工具,和npm类似主要特点:快速、安全、可靠  快速:本地安装包后,会进行缓存,下次再安装时,直接从缓存中取,不需要再请求网络  安全:通过相关机制... 查看详情

ssh学习小记

ssh为SecureSHell的缩写。OpenSSH:ssh协议的开源实现。SSH协议版本 v1:基于CRC-32做MAC,不安全;man-in-middle v2:双方主机协议选择安全的MAC方式 基于DH算法做密钥交换,基于RSA或DSA实现身份认证OpenSSH实现的客户端,服务端 C/S架构 C:ssh,scp... 查看详情

数据库规范——学习小记(代码片段)

数据库规范——学习小记之前在学习后端开发的时候,在数据库这一块,有关建表与查询效率等方面一直存有疑问,但因为做的项目都很小,不太需要考虑效率与规范,所以想着能实现功能就行。因此最近打算深入了解一些建表... 查看详情

selenium学习小记

selenium用于页面自动化测试,其简介云云这里不再粘来粘去的赘述,浪费时间。下面说说自己遇到的一点小问题,及其处理方法。一:selenium安装  安装方法,百度一下,相比大家都会见到很多前辈们的详细解释。但是也并不... 查看详情

枚举enum学习小记

参考文献:[1]C++程序设计语言(特别版),裘宗燕译,机械工业出版社[2]C++Primer(3rdEd.),S.B.LippmanandJ.Lajoie,人民邮电出版社 1、枚举enum的用途浅例   写程序时,我们常常需要为某个对象关联一组可选alternative属性.例如,学生... 查看详情

深度学习主机攒机小记

...BA%E5%B0%8F%E8%AE%B0Update:这篇文章写于一年以前,这一年深度学习的大潮继续推进,1080也升级到1080TI了,攒机也有了更多更好的选择。最近更新了一篇文章:《从零开始搭建深度学习 查看详情

cipolla算法学习小记

转自:http://blog.csdn.net/doyouseeman/article/details/52033204简介Cipolla算法是解决二次剩余强有力的工具,一个脑洞大开的算法。 认真看懂了,其实是一个很简单的算法,不过会感觉得出这个算法的数学家十分的机智。基础数论储备... 查看详情

学习定位模型小记

CSS有3种基本的定位机制:普通文档流,浮动,绝对定位普通文档流:除非专门指定,否则所有框都在普通流中定位,普通流中元素框的位置由元素在HTML中的位置决定。用position进行定位:static:position的默认属性,相当于没有对... 查看详情

redux核心api学习小记(代码片段)

Store是应用状态state的管理者,包含下列四个函数:Store.getState() //获取整个state树Store.dispatch(action) //触发state改变的【唯一途径】Store.subscribe(listener) //可以理解为DOM中的addEventListenerStore.replaceReducer(nextReducer 查看详情

机器学习小记——knn(k近邻)^_^

...大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误祝大家开心进步每一天~博文代码全部为python 简单的说一下什么是机器学... 查看详情

小记----jdbc学习了解

JDBC  使用java程序去连接数据库。  JDBC是一种执行sql语句的javaAPI;  JDBC由一组用java序言编写的类和接口组成;  JDBC提供了一种操作数据的标准;  JDBC的目标是使java程序员使用JDBC可以连接任何提供了JDBC驱动程序的... 查看详情

《动手学深度学习》小记

一、随着书上的步骤安装环境,第一个需要解决的问题是如何配合该书利用jupyter:在下载好的gluon_tutorials_zh-1.0文件夹处启动命令窗口(1.shift+右键+从此处打开命令行窗口2.进入该文件夹,在文件路径处输入cmd可达到同样的效果... 查看详情

javascript日常学习小记

一.1.通过var创建的全局变量(任何函数外的程序创建的)是不能被删除的;   2.无var创建的隐式全局变量(无视是否是在函数内外)是可以被删除的;  (由于JavaScript的两个特征,不自觉地创建出全局变量是出... 查看详情

tmux学习小记(代码片段)

层次概念会话:不同的项目,任务Note:在所有tmux中,命令的激活键,默认是ctrl+b显示已有会话列表:tmuxlss(不能用在最初的shell里)重新连接存在的会话:tmuxattach-t数字|名字新建会话:tmuxnew-sname删除已有会话:tmuxkill-session-tname窗口:一个项... 查看详情

min_25筛学习小记(代码片段)

前言为什么叫学习小记呢?因为暂时除了模板题就没有做其他的东西了。(雾这个东西折磨了我一整天,一堆有问题的题解看得我身不如死,只好结合代码理解题解,差点死在机房。(话说半天综合半天竞赛真是害人不浅)为了... 查看详情