Logstash使用grok解析IIS日志

Logstash使用grok解析IIS日志

1. 安装配置

安装Logstash前请确认Elasticsearch已经安装正确,参见RedHat6.4安装Elasticsearch5.2.0

下载链接为:logstash-5.2.0.rpm

下载完成后,rpm -i logstash-5.2.0.rpm即可安装。

Logstash默认的配置文件位置为./config/etc/logstash/,后者已经存在,但直接运行依然会报错:

WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs to console

简单起见,直接在Logstash根目录创建软链接即可:

cd /usr/share/logstash
ln -s /etc/logstash

设置配置文件实时生效,从而不用频繁地启停Logstash。修改/etc/logstash/logstash.yml

config.reload.automatic: true

2. 运行

与Elasticsearch、Kibana不同,Logstash默认并不作为系统服务安装,我们也不建议作为服务启动。主要原因为:

  • 大多数情况下,Elasticsearch、Kibana在每台服务器上只有一个实例,可以作为服务启动;而一个Logstash实例一般只服务于一个数据流,因此一台服务器上经常运行多个实例;
  • Elasticsearch、Kibana是服务器端,而Logstash是客户端。

编写一个配置文件helloworld.conf进行测试。注意,不要把该文件放在/etc/logstash/conf.d下,以避免不同实例间产生混淆,因为该文件夹是Logstash默认读取的文件夹。简单起见,可直接放在Logstash根目录下。

input {
    stdin {}
}
output {
    stdout {}
}

这是一个命令行输入、命令行输出的Logstash实例,运行成功则说明已配置正确:

bin/logstash -f helloworld.conf

虽然如此,很多时候我们还是希望各个Logstash实例能随系统而启动并在后台运行。将其加入计划任务即可:

@reboot nohup /usr/share/logstash/bin/logstash -f /usr/share/logstash/helloworld.conf > /dev/null &

3. grok filter解析IIS日志

Logstash处理日志的核心部分是各种各样的filter插件,其中最强大的是grok。在这里不得不吐槽一下,我工作中最常用的语言是Python,做个网页常用Javascript,最近为了Hadoop家族又把Java捡起来了。而grok filter只支持Ruby,难不成就为这个grok filter还得再学个Ruby……

幸好,grok可以通过自定义正则表达式进行拓展,结合其他基本filter,基本可以解决常见的日志。grok内置的正则表达式位于:/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-4.0.2/patterns/,可以逐个文件查看,看看有没有可用的正则表达式。

IIS日志的格式举例如下,实际中的字段随IIS服务器的配置而不同:

#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status sc-win32-status sc-bytes cs-bytes time-taken cs-version cs-host cs(User-Agent) cs(Referer)
2010-07-30 01:06:43 192.168.0.102 - 192.168.0.102 80 GET /css/rss.xslt - 304 0 140 358 0 HTTP/1.1 www.mvpboss1004.com Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+InfoPath.2;+360SE) -

grok-patterns文件中,有我们需要的基本正则表达式。编辑iis文件,放在patterns文件夹下:

IIS_LOG %{TIMESTAMP_ISO8601:@timestamp} %{IP:c_ip} %{NOTSPACE:cs_username} %{IP:s_ip} %{NUMBER:s_port} %{WORD:cs_method} %{URIPATH:cs_uri_stem} %{NOTSPACE:cs_uri_query} %{NUMBER:sc_status} %{NUMBER:sc_winstatus} %{NUMBER:sc_bytes} %{NUMBER:cs_bytes} %{NUMBER:time_taken} %{NOTSPACE:cs_version} %{NOTSPACE:cs_host} %{NOTSPACE:cs_useragent} %{NOTSPACE:cs_referer}

通过引用已有的正则表达式,我们可以构建复杂的正则表达式,语法为%{REGEXP:fieldname},从而将一条IIS日志解析成17个字段。而且,IIS_LOG这个正则表达式也可以被别的正则表达式引用,只需将其放在patterns文件夹下。

在运行前,可以在grok debugger上调试正则表达式,以确保其正确性。

修改helloworld.conf

input {
    stdin {
    }
}
filter {
    grok {
        match => { "message" => "%{IIS_LOG}" }
    }
}
output {
    stdout {
        codec => rubydebug
    }
}

再次运行并将上述IIS日志样例输入到命令行,可以得到解析结果:

[email protected]700:/usr/share/logstash$ sudo bin/logstash -f helloworld.conf
Sending Logstash‘s logs to /var/log/logstash which is now configured via log4j2.properties
The stdin plugin is now waiting for input:
2010-07-30 01:06:43 192.168.0.102 - 192.168.0.102 80 GET /css/rss.xslt - 304 0 140 358 0 HTTP/1.1 www.mvpboss1004.com Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+InfoPath.2;+360SE) -
{
      "cs_version" => "HTTP/1.1",
          "s_port" => "80",
       "cs_method" => "GET",
            "s_ip" => "192.168.0.102",
         "cs_host" => "www.mvpboss1004.com",
        "cs_bytes" => "358",
    "cs_useragent" => "Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+InfoPath.2;+360SE)",
     "cs_uri_stem" => "/css/rss.xslt",
         "message" => "2010-07-30 01:06:43 192.168.0.102 - 192.168.0.102 80 GET /css/rss.xslt - 304 0 140 358 0 HTTP/1.1 www.mvpboss1004.com Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+Trident/4.0;+InfoPath.2;+360SE) -",
            "c_ip" => "192.168.0.102",
      "time_taken" => "0",
    "cs_uri_query" => "-",
       "sc_status" => "304",
      "@timestamp" => 2017-02-09T15:37:19.384Z,
        "sc_bytes" => "140",
        "@version" => "1",
            "host" => "mvpboss1004-MIIX-700",
     "cs_username" => "-",
    "sc_winstatus" => "0",
      "cs_referer" => "-"
}

4. 输出到Elasticsearch

现在已经验证了解析的正确性,我们将输出从stdout改为elasticsearch。生产环境中,还需要考虑以下问题:

  • 输出中带有一些Logstash附加的字段,这是我们不一定需要的,需要将其过滤掉;
  • message字段是原始的输入日志,我们建议以以下方法进行处理:
    • 如果解析正确,把结果放入mvpboss1004这一index,并过滤掉message;
    • 如果解析错误,把结果放入failure这一index,保留所有的字段以查找错误原因。

过滤的问题,可以使用mutate filter。条件判断的问题,grok会为解析失败的日志打上_grokparsefailurede的标签,可以利用这一标签判断是否进行过滤及输出的index。修改helloworld.conf

input {
    stdin {
    }
}
filter {
    grok {
        match => { "message" => "%{IIS_LOG}" }
    }
    if !([tags] and "_grokparsefailure" in [tags]) {
        mutate {
            remove_field => ["message", "@version", "host"]
        }
    }
}
output {
    if [tags] and "_grokparsefailure" in [tags] {
        elasticsearch {
            hosts => ["99.1.36.164"]
            index => "failure"
            document_type => "iislog"
        }
    } else {
        elasticsearch {
            hosts => ["99.1.36.164"]
            index => "mvpboss1004"
            document_type => "iislog"
        }
    }
}

5. 一些疑问

由于资料太少,还有些坑我至今仍不清楚原因。最大的困惑就是Logstash各个filter之间生效的顺序问题。

例如,grok本身具备过滤字段的功能,但如果采用网上的例子,filter会在正则表达式解析前就把message字段过滤掉,导致解析失败:

filter {
    grok {
        match => { "message" => "%{IIS_LOG}" }
        remove_field => ["message"]
    }
}

不光grok,大多数filter都具备过滤字段的功能,但如果不是mutate filter,一样会在正则表达式解析前就把message字段过滤掉,比如json filter:

filter {
    grok {
        match => { "message" => "%{IIS_LOG}" }
    }
    json {
        remove_field => ["message"]
    }
}

但只要使用mutate filter就没问题:

filter {
    grok {
        match => { "message" => "%{IIS_LOG}" }
    }
    mutate {
        remove_field => ["message"]
    }
}

这还是一个简单的例子,多个filter、每个filter内多个字段时,就更乱了。如果你知道原因,请务必留言告诉我,非常感谢。

时间: 2024-11-05 18:58:48

Logstash使用grok解析IIS日志的相关文章

网站运维工具使用iis日志分析工具分析iis日志(iis日志的配置)

我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情.有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的.还有些时候,我们希望不断地优化网站,让网站更快速的响应用户请求,这些事情都发生在开发之后的运维阶段. 与开发阶段不同的,运维阶段不可能让你去调试程序,发现各

【转】IIS日志-网站运维的好帮手

对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的响应用户请求, 这些事情都发生在开发之后的运维阶段. 与开发阶段不同的,运维阶段不可能让你去调试程序,发现各类问题, 我们只能通过各种系统日志来分析网站的运行状况, 对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题, 或者存在

IIS日志-网站运维的好帮手

原文:IIS日志-网站运维的好帮手 对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的响应用户请求, 这些事情都发生在开发之后的运维阶段. 与开发阶段不同的,运维阶段不可能让你去调试程序,发现各类问题, 我们只能通过各种系统日志来分析网站的运行状况, 对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,

Logstash——解析各类日志文件

原理 使用filebeat来上传日志数据,logstash进行日志收集与处理,elasticsearch作为日志存储与搜索引擎,最后使用kibana展现日志的可视化输出.所以不难发现,日志解析主要还是logstash做的事情. 从上图中可以看到,logstash主要包含三大模块: INPUTS: 收集所有数据源的日志数据([源有file.redis.beats等,filebeat就是使用了beats源*): FILTERS: 解析.整理日志数据(本文重点): OUTPUTS: 将解析的日志数据输

iis日志字段解析

IIS日志字段 #Software: Microsoft Internet Information Services 7.5 #Version: 1.0 #Date: 2013-08-21 01:00:00 #Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie)

ELK logstash 处理MySQL慢查询日志(初步)

写在前面:在做ELK logstash 处理MySQL慢查询日志的时候出现的问题: 1.测试数据库没有慢日志,所以没有日志信息,导致 IP:9200/_plugin/head/界面异常(忽然出现日志数据,删除索引后就消失了) 2.处理日志脚本问题 3.目前单节点 配置脚本文件/usr/local/logstash-2.3.0/config/slowlog.conf[详细脚本文件见最后] output { elasticsearch { hosts => "115.28.3.150:9200

使用logstash+elasticsearch+kibana快速搭建日志平台

日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数.执行时间.成功率等 异常数据自动触发消息通知 基于日志的数据挖掘 很多团队在日志方面可能遇到的一些问题有: 开发人员不能登录线上服务器查看详细日志,经过运维周转费时费力 日志数据分散在多个系统,难以查找 日志数据量大,查询速度慢 一个调用会涉及多个系统,难以在这些系统的日志中快速定位数据 数据不够实时 常见的一些重量级的开源

利用LogParser分析IIS日志

LogParser是微软官方出品的用于读取分析IIS日志的工具,使用类SQL语句过滤文本日志内容,并可将内容导出到csv.sqlserver作进一步分析 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=24659 目前最新版本为2.2,下载后一直下一步,默认安装目录为:C:\Program Files (x86)\Log Parser 2.2\     一.获取IIS日志 记日志时间默认是UTC,如要使用本地时间记录,可勾

IIS日志自动删除程序 收藏

很多使用Windows IIS的站长可能都会遇到这个问题,就是服务器的IIS日志增长经常会导致磁盘空间被占满,而IIS也没有自动删除日志的功能,因此需要经常关注即时清理日志,因此我这里就介绍一个能够自动删除IIS日志的程序. 这个删除程序的功能很简单,每天自动删除N天前的日志(时间根据情况自己设置,一般设置为30天),可以使用DOS批处理或VBS脚本来实现. 在下边的解决方案里请大家可以选择适合自己的,总体设计思路是这样的: IIS日志文件的格式是:ex年月日.log 比如:ex071116.l