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 ./config

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

2. 运行

与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日志样例输入到命令行,可以得到解析结果:

mvpboss1004@mvpboss1004-MIIX-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"
}
}
}


作者:mvpboss1004
链接:https://www.jianshu.com/p/962619eb02f4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

  1. Logstash grok解析IIS 10.0 日志实例

    Logstash解析IIS日志的核心在于logstash配置文件 IIS 日志位置和格式如下: #Software: Microsoft Internet Information Services 1 ...

  2. Logstash使用grok过滤nginx日志(二)

    在生产环境中,nginx日志格式往往使用的是自定义的格式,我们需要把logstash中的message结构化后再存储,方便kibana的搜索和统计,因此需要对message进行解析. 本文采用grok ...

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

    对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...

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

    我们只能通过各种系统日志来分析网站的运行状况,对于部署在IIS上的网站来说,IIS日志提供了最有价值的信息,我们可以通过它来分析网站的响应情况,来判断网站是否有性能问题,或者存在哪些需要改进的地方 对 ...

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

    对于一个需要长期维护的网站来说,如何让网站长久稳定运行是件很有意义的事情. 有些在开发阶段没有暴露的问题很有可能就在运维阶段出现了,这也是很正常的. 还有些时候,我们希望不断地优化网站,让网站更快速的 ...

  6. 使用logstash的grok插件解析springboot日志

    使用logstash的grok插件解析springboot日志 一.背景 二.解决思路 三.前置知识 四.实现步骤 1.准备测试数据 2.编写`grok`表达式 3.编写 logstash pipel ...

  7. logstash 抓取IIS日志文件写入Elasticsearch

    如果需要对IIS日志进行分析可以使用logstash从文件中抓取出来进行分析: 输入部分: input { file { type => "iis_log_monitor" ...

  8. 【Logstash系列】使用Logstash作为收集端采集IIS日志

    现阶段Logstash在Windows端的日志采集一直存在若干问题,包括:   1. LS有读锁:进程开启后Input指定路径下的所有文件都会被锁死无法重命名或删除. 2. LS不识别*:如果在pat ...

  9. Logstash 收集 IIS 日志

    日志样例 查看 IIS 日志配置,选择格式为 W3C(默认字段设置)保存生效. 2016-02-25 01:27:04 112.74.74.124 GET /goods/list/0/1.html - ...

随机推荐

  1. SEL 类型

    1.SEL类型的第一个作用, 配合对象/类来检查对象/类中有没有实现某一个方法 SEL sel = @selector(setAge:); Person *p = [Person new]; // 判 ...

  2. 新手教程: 如何在新浪云计算SAE里部署代码

    感谢 sou6 的投递 时间:2011-11-22 来源:老夏博客 SAE自2011-7-10日起,全面支持SVN代码部署,用户不仅可以通过任何SVN客户端部署代码,而且SAE现有的代码部署方式也已经 ...

  3. ActiveMQ 使用文档

    一.为什么使用ActiveMQ 在总线的设计中可能会使用到JMS(Java Message Service)通道, Java消息服务(JMS)超越了生产商专有的MOM(Message-Oriented ...

  4. spring4-4-jdbc-02

    1.简化 JDBC 模板查询 每次使用都创建一个 JdbcTemplate 的新实例, 这种做法效率很低下. JdbcTemplate 类被设计成为线程安全的, 所以可以再 IOC 容器中声明它的单个 ...

  5. 浅谈利用PLSQL的多线程处理机制,加快处理大数据表的效率

    我们在处理大数据表的时候经常会感觉的处理速度不够快,效率不够高,那么今天下面我就来简单实现下PLSQL的多线程编程处理数据: 我模拟一个简单的场景,把某一张表中的数据(当然这张表的数据非常大)同步到目 ...

  6. .net 多线程同步的相关知识点

    在多线程开发中,共享对象的同步是经常遇到的问题,以下总结了C#中线程同步的几种技术: 1,InterLocked原子操作 Decrement(ref int location);递减1 Add(ref ...

  7. 出现命令提示apt-get -f install的解决方法

    提示apt-get -f install这个信息,然后查看其他的提示信息发现时缺少了一些以依赖库. 解决办法为执行:sudo apt-get -f install命令. 该命令的含义是去补全那些缺少的 ...

  8. TF Boys (TensorFlow Boys ) 养成记(五): CIFAR10 Model 和 TensorFlow 的四种交叉熵介绍

    有了数据,有了网络结构,下面我们就来写 cifar10 的代码. 首先处理输入,在 /home/your_name/TensorFlow/cifar10/ 下建立 cifar10_input.py,输 ...

  9. IBatis模糊查询

    IBatis模糊查询  补充: mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * ...

  10. 使用 ServiceStack 构建跨平台 Web 服务(转)

    出处:http://www.cnblogs.com/shanyou/p/3348347.html 本文主要来自MSDN杂志<Building Cross-Platform Web Service ...