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作为调试打开看看,输出的是什么内容。执行命令例如以下以及输出

[joeywen@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编程

看看输出

[joeywen@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 }
}

输出

[joeywen@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"
}

转载请注明出处

logstash 学习小记的更多相关文章

  1. mongodb入门学习小记

    Mongodb 简单入门(个人学习小记) 1.安装并注册成服务:(示例) E:\DevTools\mongodb3.2.6\bin>mongod.exe --bind_ip 127.0.0.1 ...

  2. javascript学习小记(一)

    大四了,课少了许多,突然之间就不知道学什么啦.整天在宿舍混着日子,很想学习就是感觉没有一点头绪,昨天看了电影激战.这种纠结的情绪让我都有点喘不上气啦!一点要找点事情干了,所以决定找个东西开始学习.那就 ...

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

    原文:js 正则学习小记之匹配字符串 今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高 ...

  4. js 正则学习小记之左最长规则

    原文:js 正则学习小记之左最长规则 昨天我在判断正则引擎用到的方法是用 /nfa|nfa not/ 去匹配 "nfa not",得到的结果是 'nfa'.其实我们的本意是想得到整 ...

  5. js 正则学习小记之NFA引擎

    原文:js 正则学习小记之NFA引擎 之前一直认为自己正则还不错,在看 次碳酸钴,Barret Lee 等大神都把正则玩的出神入化后发现我只是个战五渣.  求抱大腿,求大神调教. 之前大致有个印象,正 ...

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

    原文:js 正则学习小记之匹配字符串优化篇 昨天在<js 正则学习小记之匹配字符串>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯 ...

  7. CSS学习小记

    搜狗主页页面CSS学习小记 1.边框的处理   要形成上图所示的布局效果,即,点选后,导航下面的边框不显示而其他的边框形成平滑的形状.相对于把导航的下面边框取消然后用空白覆盖掉下面搜索栏的边框比较而言 ...

  8. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

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

    昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...

随机推荐

  1. python 全栈开发,Day32(知识回顾,网络编程基础)

    一.知识回顾 正则模块 正则表达式 元字符 : . 匹配除了回车以外的所有字符 \w 数字字母下划线 \d 数字 \n \s \t 回车 空格 和 tab ^ 必须出现在一个正则表达式的最开始,匹配开 ...

  2. python 全栈开发,Day2(in,while else,格式化输出,逻辑运算符,int与bool转换,编码)

    一.in的使用 in 操作符用于判断关键字是否存在于变量中 a = '男孩wusir' print('男孩' in a) 执行输出: True in是整体匹配,不会拆分匹配. a = '男孩wusir ...

  3. ngrinder的简介与基本使用(转载:https://www.jianshu.com/p/f336180806cc)

    nGrinder简介 nGrinder是基于Grinder开源项目,由NHN公司的开发团队进行了重新设计和完善.nGrinder是一款非常易用,有简洁友好的用户界面和controller-agent分 ...

  4. Mac 下 Redis 5.0 的卸载与安装

    卸载 停止 redis 服务器 redis-cli shutdown 检测 #检测后台进程是否存在 ps -ef |grep redis #检测6379端口是否在监听 netstat -lntp | ...

  5. C#编码、解码

    1.HttpUtility.UrlEncode 方法: 对 URL 字符串进行编码,以便实现从 Web 服务器到客户端的可靠的 HTTP 传输.重载列表: [1]将字节数组转换为已编码的 URL 字符 ...

  6. KNN分类算法补充

    KNN补充: 1.K值设定为多大? k太小,分类结果易受噪声点影响:k太大,近邻中又可能包含太多的其它类别的点. (对距离加权,可以降低k值设定的影响) k值通常是采用交叉检验来确定(以k=1为基准) ...

  7. Redis数据结构之sorted-set

    一:介绍 1.说明 与set的主要区别 sorted-set中的成员需要一个分数,分数可以重复的. 位置是有序的 二:Redis客户端 1.添加 如果key已经存在,再次添加一个key相同的,但是分部 ...

  8. Python2 - 基础2 - 数据类型和模块

    一.数据类型 标准数据类型(5): Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) 其中数字类型有4种: int(有符号整型) 在3 ...

  9. Unicode字符编码表(转)

    Unicode字符编码表     版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zhenyu5211314/article/details/5153 ...

  10. 解决linux下“XX不在 sudoers 文件中。此事将被报告"的问题

    在使用sudo命令时,经常性会提示出“不在 sudoers 文件中.此事将被报告”的错误信息. 这是因为当前登录的账号不在sudo权限里面. sudo命令可以让你以root身份执行命令,来完成一些我们 ...