热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Logstash语法常用案例解析(二)

摘要此篇主要讲Filter插件,已经对nginx日志的各种处理实例接着上篇继续说插件1,Filter插件Grok:正则捕获Date:时间处理Mutate:数据修改Geoip:查询归类JS

摘要

此篇主要讲Filter插件,已经对nginx 日志的各种处理实例

接着上篇继续说插件

1,Filter插件

  • Grok:正则捕获

  • Date:时间处理

  • Mutate:数据修改

  • Geoip:查询归类

  • JSON:编解码

Grok:解析和结构化任何文本。

http://grokdebug.herokuapp.com/patterns#        匹配规则,注意空格,如果空格不匹配也会报错

http://grokdebug.herokuapp.com/                         匹配检查,而且有语法提示

Grok 目前是logstash最好的方式对非结构化日志数据解析成结构化和可查询化。logstash内置了120个匹配模式,满足大部分需求。

格式:

filter {
    grok {
        match => { "message" => "grok_pattern" }
    }
}

注 :
        grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成,其中SYNTAX是表达式的名字,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。SEMANTIC表示解析出来的这个字符的名字,由自己定义,例如IP字段的名字可以是client。

简单例子:

#cat  conf.d/test.conf input {stdin{}}          #输入方式为标准输入  filter {  grok {                   #grok插件匹配    #patterns_dir => "/path/to/patterns"   #将匹配规则写到指定文件方便管理    match => {    "message" => "%{WORD} %{NUMBER:request_time:float} %{WORD}"}           #WORD匹配字符串,NUMBER匹配数值,支持int,float格式。匹配的值赋给request_time变量  #remove_field => ["message"]  #处理结果删除掉message字段  }}output {                  #输出方式为标准输出  stdout {codec=>rubydebug}        #定义输出格式为rubydebug}

        结果:

# ./bin/logstash   -f conf.d/test.confLogstash startup completedbegin 123.456 end {"message" => "begin 123.456 end",   #remove之后就不显示了。"@version" => "1","@timestamp" => "2016-05-09T02:43:47.952Z","host" => "dev-online","request_time" => 123.456               #grok匹配中新加的变量}

        Nginx 日志处理匹配:
        因为nginx日志已经被处理成json数据,传过来就是key:value的方式,打印成rubydebug格式如下:

wKioL1knm73CC3X-AADz90mDC0Y898.png        所以现在想要筛选不要的字段

input {  file {    path => "/var/log/nginx/access.log"    type => "json"    codec => "json"    start_position => "beginning"  }}filter {  grok {    match => {    "@timestamp" =>"%{WORD}"        #先把不想要的字段匹配出来    "type" => "%{WORD}"    }  remove_field => ["@timestamp","type"]  #再移除字段}}output {  stdout {    codec=>rubydebug  }}

        运行结果:

wKiom1knnAKCgFBSAADQQtzPQOw613.png        nginx 日志json格式:

log_format     json        '{"@timestamp":"$time_iso8601",'                            '"@version":"1",'                            '"host":"$server_addr",'                            '"client":"$remote_addr",'                            '"size":$body_bytes_sent,'                            '"responsetime":$request_time,'                            '"domain":"$host",'                            '"url":"$request",'                            '"refer":"$http_referer",'                            '"agent":"$http_user_agent",'                            '"status":"$status"}';access_log /var/log/nginx/access.log json;

nginx配置文件常用正则匹配参数

nginx 日志格式                     匹配项目                                                        备注

$remote_addr                      %{IPORHOST:clientip}

$remote_user                       %{NOTSPACE:remote_user}

[$time_local]                        \[%{HTTPDATE:timestamp}\]                  “[]"需要属于特殊字符需要转义一下

"$request"                             "%{WORD:method}                                   访问请求,一般都加"",匹配时也加一下。 WORD匹配GET,POST

method                              %{URIPATHPARAM:request}                   URIPATHPARAM匹配请求的uri

HTTP                                %{NUMBER:httpversion}"                         NUMBER匹配数字,并赋值给httpversion http协议版本

$status                                  %{NUMBER:status}                                     NUMBER匹配数字,并赋值给status,作为返回状态

$body_bytes_sent                %{NUMBER:response}                                内容大小

"$http_referer"                    "%{QS:referrer}"                                            匹配请求refer

"$http_user_agent"             "%{QS:agent}"                                               匹配亲切agent

"$http_x_forwarded_for"    "%{QS:xforwardedfor}"                                   匹配xfw

$upstream_addr                  %{IPV4:upstream}:%{POSINT:port}

$scheme                               %{WORD:scheme}                                    匹配http or https

eg: nginx日志格式

log_format  access  '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

日志实例:

"192.168.1.22 - - [20/Apr/2016:16:28:14 +0800] "GET /ask/232323.html HTTP/1.1" 500 15534 "http://test.103.100xhs.com/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36""

匹配规则

"%{IPORHOST:clientip} - %{NOTSPACE:remote_user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:status} %{NUMBER:response} %{QS:referrer} %{QS:agent}"

Geoip地址查询:

GeoIP 是最常见的免费 IP 地址归类查询库,GeoIP 库可以根据 IP地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计非常有用

input {    stdin{}    }  filter {  geoip {      source => "message"     #source必须为公网ip  否则geoip不会显示数据    #      fields => ["city_name","country_code2","country_name","latitude","longitude"]          }      #geoip输出的内容比较多,可以指定输出的列      }output {  stdout{      codec=>rubydebug        }  }

找到对应IP的key 就是geoip  中source所指定的值。

完整的例子:

wKioL1knnLjxPmpXAADMCy17rY0708.png

        结果:

wKiom1knnNzDcP_kAAE9Dp2e_Ps808.png

注意:geoip 插件的 "source" 字段可以是任一处理后的字段,比如 "client_ip",但是字段内容却需要
        小心!geoip 库内只存有公共网络上的 IP 信息,查询不到结果的,会直接返回 null,

JSON:

input {stdin{}}  filter {    json {      source => "message"              #必选项    }}output {  stdout{    codec=>rubydebug  }}

        结果:

{"name":"wd","age":"15"}{"message" => "{\"name\":\"wd\",\"age\":\"15\"}","@version" => "1","@timestamp" => "2016-05-09T06:32:13.546Z",     #加一个时间戳的好处是方便kibana导入"host" => "dev-online","name" => "wd","age" => "15"}

Date事件处理

注意:因为在稍后的 outputs/elasticsearch 中常用的 %{+YYYY.MM.dd} 这种写法必须读取 @timestamp 数据,所以一定不要直接删掉这个字段保留自己的字段,而是应该用 filters/date 转换后删除自己的字段!

filter {  grok {    match => ["message", "%{HTTPDATE:logdate}"]  }  date {    match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]  }}

注意:时区偏移量只需要用一个字母 Z 即可。

Mutate数据修改

1,类型转换

可以设置的转换类型包括:"integer","float" 和 "string"。示例如下

filter {  mutate {    convert => ["request_time", "float"]  }}

注意:mutate 除了转换简单的字符值,还支持对数组类型的字段进行转换,即将 ["1","2"] 转换成 [1,2]。但不支持对哈希类型的字段做类似处理。有这方面需求的可以采用稍后讲述的 filters/ruby 插件完成。

2,字符串处理

gsub 仅对字符串类型字段有效

gsub => ["urlparams", "[\\?#]", "_"]

split

split => ["message", "|"]

随意输入一串以|分割的字符,比如 "123|321|adfd|dfjld*=123",可以看到如下输出:

wKiom1knnVuho9m8AABWZj8sOmk235.png

join 仅对数组类型字段有效

我们在之前已经用 split 割切的基础再 join 回去。配置改成:

join => ["message", ","]

merge合并两个数组或者哈希字段。依然在之前 split 的基础上继续:

merge => ["message", "message"]

wKioL1knnXrgRPwTAAByX-ohlws478.png

rename 重命名某个字段,如果目的字段已经存在,会被覆盖掉:

rename => ["syslog_host", "host"]

update 更新某个字段的内容。如果字段不存在,不会新建。

replace 作用和 update 类似,但是当字段不存在的时候,它会起到 add_field 参数一样的效果,自动添加新的字段。

Codec编码插件

json: 直接输入预定义好的 JSON 数据,这样就可以省略掉 filter/grok 配置!

path => "/var/log/nginx/access.log_json""

codec => "json"

Multiline:合并多行数据

stdin {  codec => multiline {    pattern => "^\["    negate => true    what => "previous"  }}

        终端输入:以 the end 结束,换行无法结束。

本文出自 “aolens・程超” 博客,请务必保留此出处http://aolens.blog.51cto.com/7021142/1929705


推荐阅读
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 使用HTML和JavaScript实现视频截图功能
    本文介绍了如何利用HTML和JavaScript实现从远程MP4、本地摄像头及本地上传的MP4文件中截取视频帧,并展示了具体的实现步骤和示例代码。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • javax.mail.search.BodyTerm.matchPart()方法的使用及代码示例 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • Android目录遍历工具 | AppCrawler自动化测试进阶(第二部分):个性化配置详解
    终于迎来了“足不出户也能为社会贡献力量”的时刻,但有追求的测试工程师绝不会让自己的生活变得乏味。与其在家消磨时光,不如利用这段时间深入研究和提升自己的技术能力,特别是对AppCrawler自动化测试工具的个性化配置进行详细探索。这不仅能够提高测试效率,还能为项目带来更多的价值。 ... [详细]
  • 为何Serverless将成为未来十年的主导技术领域?
    为何Serverless将成为未来十年的主导技术领域? ... [详细]
  • 本文详细介绍了 Sublime Text 3 在 2021 年的激活密钥及其在线激活方法。用户可以通过提供的链接访问云海天教程,获取更多详细的激活码信息和操作步骤。此外,文章还提供了安全可靠的激活方案,帮助用户顺利激活软件,提升编程效率。 ... [详细]
author-avatar
b1b
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有