elk日志处理之使用grok解析日志

esc_ai esc_ai     2022-08-25     430

关键词:

一、简介

Grok是迄今为止使蹩脚的、无结构的日志结构化和可查询的最好方式。Grok在解析 syslog logs、apache and other webserver logs、mysql logs等任意格式的文件上表现完美。

Grok内置了120多种的正则表达式库,地址:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

二、入门例子

下面是一条tomcat日志:

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

从filebeat中输出到logstash,配置如下:

input {
    beats {
        port => "5043"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
    stdout { codec => rubydebug }
}

fileter中的message代表一条一条的日志,%{COMBINEDAPACHELOG}代表解析日志的正则表达式,COMBINEDAPACHELOG的具体内容见:https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/httpd。解析后:

{
        "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
         "offset" => 325,
           "auth" => "-",
          "ident" => "-",
     "input_type" => "log",
           "verb" => "GET",
         "source" => "/path/to/file/logstash-tutorial.log",
        "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
           "type" => "log",
           "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
       "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
     "@timestamp" => 2016-10-11T21:04:36.167Z,
       "response" => "200",
          "bytes" => "203023",
       "clientip" => "83.149.9.216",
       "@version" => "1",
           "beat" => {
        "hostname" => "My-MacBook-Pro.local",
            "name" => "My-MacBook-Pro.local"
    },
           "host" => "My-MacBook-Pro.local",
    "httpversion" => "1.1",
      "timestamp" => "04/Jan/2015:05:13:42 +0000"
}

再比如,下面这条日志:

55.3.244.1 GET /index.html 15824 0.043

这条日志可切分为5个部分,IP(55.3.244.1)方法(GET)请求文件路径(/index.html)字节数(15824)访问时长(0.043),对这条日志的解析模式(正则表达式匹配)如下:

%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

写到filter中:

filter {
    grok {
        match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}"}
    }
}

解析后:

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043

三、解析任意格式日志

解析任意格式日志的步骤:

  1. 先确定日志的切分原则,也就是一条日志切分成几个部分。
  2. 对每一块进行分析,如果Grok中正则满足需求,直接拿来用。如果Grok中没用现成的,采用自定义模式。
  3. 学会在Grok Debugger中调试。

下面给出例子,来两条日志:

2017-03-07 00:03:44,373 4191949560 [          CASFilter.java:330:DEBUG]  entering doFilter()

2017-03-16 00:00:01,641 133383049 [    UploadFileModel.java:234:INFO ]  上报内容准备写入文件

切分原则:

2017-03-16 00:00:01,641:时间
133383049:编号
UploadFileModel.java:java类名
234:代码行号
INFO:日志级别
entering doFilter():日志内容

前五个字段用Grok中已有的,分别是TIMESTAMP_ISO8601NUMBERJAVAFILENUMBERLOGLEVEL,最后一个采用自定义正则的形式,日志级别的]之后的内容不论是中英文,都作为日志信息处理,使用自定义正则表达式子的规则如下:

(?<field_name>the pattern here)

最后一个字段的内容用info表示,正则如下:

(?<info>([\s\S]*))

上面两条日志对应的完整的正则如下,其中\s*用于剔除空格。

\s*%{TIMESTAMP_ISO8601:time}\s*%{NUMBER:num} \[\s*%{JAVAFILE:class}\s*\:\s*%{NUMBER:lineNumber}\s*\:%{LOGLEVEL:level}\s*\]\s*(?<info>([\s\S]*))

正则解析容易出错,强烈建议使用Grok Debugger调试,姿势如下。

这里写图片描述

四、参考资料

  1. plugins-filters-grok
  2. Parsing Logs with Logstash

Logstash 应该只记录 grok 解析的消息

...7-01-1609:54:07【问题描述】:目前我有一个ELK堆栈,其中的日志由filebeat传送,在logstash中的一些过滤器之后,它被转发到ES。由于有很多服务器和日志,大量日志正在进入logstash,但我已将过滤器配置为仅处理非常特定类型的日志... 查看详情

日志分析系统elk之logstash(代码片段)

...输出Logstash安装与配置通过命令行运行Logstash参数-e参数-f日志输出到文件日志上传到elasticsearchLogstash伪装为日志服务器grok过滤插件分割命令行的信息输出到终端采集apache日志切片输出到es什么是ELK一般我们需要进行日志分析场景 查看详情

elk日志处理开发指南

ELK是Elastic公司出品的开源实时日志处理与分析解决方案,ELK分别代表分布式搜索引擎Elasticsearch、日志采集与解析工具Logstash、日志可视化分析工具Kibana,具有配置方式灵活、集群可线性扩展、日志实时导入、检索性能高... 查看详情

elk日志处理之使用logstash收集log4j日志

介绍一下如何从Java工程中导出log4J日志到Logstash。一、log4j基础不能免俗的官方介绍:Log4j是一个使用Java语言编写的,可靠、快速、灵活的日志框架(API),使用ApacheSoftwareLicense授权。它被移植到C、C++、C#、Perl、Python、Ruby和Eiffel... 查看详情

[转]elk之logstash

...sp;ELK之Logstash简介:ELK之LogstashLogstash是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。在一个典型的使用场景下(ELK):用Elasticsearch 查看详情

logstash:日志解析的grok模式示例(代码片段)

如果没有日志解析,搜索和可视化日志几乎是不可能的,一个被低估的技能记录器需要读取他们的数据。解析结构化你的传入(非结构化)日志,以便用户可以在调查期间或设置仪表板时搜索清晰的字段和值... 查看详情

logstash grok,用 json 过滤器解析一行

...正在使用ELK(弹性搜索、kibana、logstash、filebeat)来收集日志。我有一个包含以下几行的日志文件,每一行都有一个json,我的目标是使用LogstashGrok取出json中的键/值对并将其转发到弹性搜索。201 查看详情

logstash:日志解析的grok模式示例(代码片段)

如果没有日志解析,搜索和可视化日志几乎是不可能的。解析结构化您的传入(非结构化)日志,以便用户可以在调查期间或设置仪表板时搜索清晰的字段和值。最流行的日志解析语言是Grok。你可以使用Grok插件... 查看详情

使用 Grok for Logstash 解析 Apache2 错误日志

】使用GrokforLogstash解析Apache2错误日志【英文标题】:ParseApache2ErrorlogswithGrokforLogstash【发布时间】:2013-06-2406:32:12【问题描述】:我正在尝试解析我的apache2错误日志,但遇到了一些麻烦。它似乎与过滤器不匹配。我很确定时间戳... 查看详情

使用grok解析activedirectory日志的速度很慢(代码片段)

...解析器解析Microsoftactivedirectorylogs。我正在使用javagrok库。日志看起来像<13>10.200.3.710.20.211.1507/04/201715:34:00PMSERVER0107/04/201715:34:00PMLogName=SecuritySourceName=MicrosoftWindowssecurityauditing.EventCode=4624EventType=0Type=InformationComputerName=SERVER01.netw... 查看详情

elk笔记4--grok正则解析

...者向右逐个字段抽出,对于正则中的通配符需要进行转义处理,否则这类字符作为分割标志的时候容易解析出错2)也可以直接从左到右逐个字段取出2grok切分案例案例1内容:2016/04/2712:22:50OSPF 查看详情

elk——elasticstack日志分析平台(代码片段)

ElasticStack日志分析平台ELK日志采集与分析系统概述重读日志文件使用Processors(处理器)过滤和增强数据LogstashLogstash安装使用Grok过滤器插件解析Web日志使用Geoip过滤器插件增强数据编辑**配置接受Beats的输入ES集群基本介绍... 查看详情

elk日志分析平台之logstash数据采集(代码片段)

...1a;标准输入,输出到ES和标准输出到终端三Logstash采集日志四过滤1多行过滤插件2grok切片过 查看详情

elk日志分析平台之logstash数据采集(代码片段)

...1a;标准输入,输出到ES和标准输出到终端三Logstash采集日志四过滤1多行过滤插件2grok切片过 查看详情

elk日志系统之kibana的使用操作

1、ELK日志系统打开后,打开kibana的操作界面,第一步创建索引模式:     2222222222222222222222222222222222222222222222   333333333333333333333333333333333创建成功    44444444 查看详情

elk应用之filebeat

参考技术AFilebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tailfile),并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通... 查看详情

logstash笔记-----grok插件的正则表达式来解析日志

(一)简介:   丰富的过滤器插件的存在是logstash威力如此强大的重要因素。名为过滤器,其实提供的不单单是过滤的功能,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的logs... 查看详情

日志分析系统elk之logstash(代码片段)

...输出Logstash安装与配置通过命令行运行Logstash参数-e参数-f日志输出到文件日志上传到elasticsearchLogstash伪装为日志服务器grok过滤插件分割命令行的信息输出到终端采集apache日志切片输出到es什么是ELK一般我们需要进行日志分析场景&... 查看详情