logstash 正则表达式gork+例子

认识正则表达式,熟悉书写格式:
以下为自定义的一些内容,在\logstash-5.5.1\vendor\bundle\jruby\1.9\gems\logstash-patterns-core-4.1.1\patterns\grok_patterns下是官方定义的一些pattern可供使用,想自定义也可以在里面定义,或者直接在fork中书写:
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 \{。
| 指明两项之间的一个选择。要匹配 |,请使用 \|。
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。
\b 匹配一个字边界,即字与空格间的位置。
\B 非字边界匹配。

例1:练习,熟悉正则表达式含义
filter {
    grok {
        match => {
            "message" => ".* sshd\[\d+\]: (?<status>\S+) .* (?<ClientIP>(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?) .*"
        }
        overwrite => ["message"]
    }
}
显示结果:
{
    "@timestamp" => 2017-01-12T04:00:16.325Z,
        "offset" => 9538,
      "@version" => "1",
    "input_type" => "log",
          "beat" => {
        "hostname" => "localhost",
            "name" => "localhost",
         "version" => "5.1.1"
    },
          "host" => "localhost",
        "source" => "/var/log/secure",
       "message" => "Jan 12 12:00:08 localhost sshd[2043]: Accepted password for root from 172.16.11.239 port 51763 ssh2",
          "type" => "log",
      "ClientIP" => "172.16.11.239",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
        "status" => "Accepted"
}




例2:
日志格式(截取其中字段):
2016-11-30 06:33:33 192.168.5.116 GET /Hotel/HotelDisplay/cncqcqb230 - 80 - 192.168.9.2 Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10.9;+en-US;+rv:1.9pre)+Gecko - 200 0 0 45 
filter {  
    grok {  
        match => [  
             "message" ,"\s*(?<time>([0-9]{4}\-[0-9]{2}\-[0-9]{2}\s+[0-9]{2}:[0-9]{2}:[0-9]{2}))\s+%{IPORHOST:clientip}\s+%{WORD:verb}\s+%{URIPATHPARAM:request}\s+\-\s+(?<port>  
  
([0-9]{2}.*?))\s+\-\s+%{IPORHOST:sourceip}\s+(?<http_user_agent>(\S+\s+).*?).*"  
                ]  
       }  
         date {  
        match => ["time", "yyyy-MM-dd HH:mm:ss"]  
    }
    mutate{
        remove_field =>["message"]
    }
}  
显示结果:
{  
            "message" => "2016-11-30 06:33:33 192.168.5.116 GET /Hotel/HotelDisplay/cncqcqb230 - 80 - 192.168.9.2 Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10.9;+en-US;  
  
+rv:1.9pre)+Gecko - 200 0 0 45",  
           "@version" => "1",  
         "@timestamp" => "2016-11-29T22:33:33.000Z",  
               "host" => "dr-mysql01.zjcap.com",  
               "time" => "2016-11-30 06:33:33",  
           "clientip" => "192.168.5.116",  
               "verb" => "GET",  
            "request" => "/Hotel/HotelDisplay/cncqcqb230",  
               "port" => "80",  
           "sourceip" => "192.168.9.2",  
    "http_user_agent" => "Mozilla/5.0+(Macintosh;+U;+Intel+Mac+OS+X+10.9;+en-US;+rv:1.9pre)+Gecko "  }


 


例3:
日志格式:
2017-08-25 08:52:58.123 INFO c.p.modules.push.service.impl.PushServiceImpl - 11生产者:%7B%22applicationId%22%3A%2257d3b7e60c53a62bb60f2aa4%22%2C%22customFilds%22%3A%7B%22url%22%3A%22wemeeting%3A%2F%2Fwemeeting.im.bbdtek.com
filter{
 
      grok {  
        match => ["message","\s*(?<logtime>([0-9]{4}\-[0-9]{2}\-[0-9]{2}\s+[0-9]{2}:[0-9]{2}:[0-9]{2}+\.+[0-9]{3}))\s+(?<level>\S+)\s+(?<logger>\S+)\s+\-+%{GREEDYDATA:details}"]  
       }  
        mutate{
        remove_field => ["message"]
        }
}
显示结果:
{
"path":"E:/testdata/test-1.log",
"@timestamp":"2017-08-29T06:39:28.309Z",
"level":"INFO",
"logger":"c.p.modules.push.service.impl.PushServiceImpl",
"@version":"1",
"host":"DESKTOP-0OGVV1E",
"details":" 11\\xC9\\xFA\\xB2\\xFA\\xD5?\\xBA%7B%22applicationId%22%3A%2257d3b7e60c53a62bb60f2aa4%22%2C%22customFilds%22%3A%7B%22url%22%3A%22wemeeting%3A%2F%2Fwemeeting.im.bbdtek.com
",
"type":"pushservice-test",
"logtime":"2017-08-25 09:53:53.999"
}



  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你好!关于Logstash的正则匹配,你可以使用Logstash的grok插件来进行处理。Grok插件提供了一种方便的方式来解析和匹配日志文件中的文本。 首先,你需要在Logstash的配置文件中定义一个grok模式,该模式描述了你想要匹配的日志行的格式。例如,如果你想要匹配一个包含日期、时间和消息的日志行,可以使用以下模式: ``` %{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:message} ``` 在这个例子中,`%{TIMESTAMP_ISO8601:timestamp}`匹配ISO8601格式的时间戳,并将其捕获为一个名为"timestamp"的字段;`%{GREEDYDATA:message}`匹配任意文本,将其捕获为一个名为"message"的字段。 接下来,在Logstash配置文件的输入部分,你可以使用grok插件来应用这个模式。例如: ``` input { file { path => "/path/to/your/logfile.log" start_position => "beginning" } } filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{GREEDYDATA:message}" } } } output { elasticsearch { hosts => ["localhost:9200"] index => "your_index" } } ``` 在这个例子中,我们将日志文件的路径指定为`/path/to/your/logfile.log`,并且使用grok插件将日志行解析为"timestamp"和"message"两个字段。然后,我们将解析后的数据发送到Elasticsearch中的索引"your_index"。 你可以根据你的具体需求定制grok模式,以匹配你的日志格式。通常,Logstash提供了一些内置的模式,也可以自定义模式来适应不同的日志格式。 希望这个回答能对你有所帮助!如果你还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c_zyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值