当前位置: 代码迷 >> 综合 >> Get IIS Errors Into Elastic
  详细解决方案

Get IIS Errors Into Elastic

热度:46   发布时间:2024-01-10 01:24:23.0

最近在做一个项目,就是把IIS生成的Error Log导到ElasticSearch中,然后再Kibana上显示出来。大致思路分为如下几步:

1. 配置IIS使之能检测服务器端的错误(400-999),并生成Error Log。

2. 安装ELK。

3. 用logstash解析errorlog,取出需要的数据,发送给ElasticSearch。

4. 把logstash作为service在服务器上自动运行。


一、配置IIS <traceFailedRequests>

参照 http://blog.csdn.net/salmonellavaccine/article/details/50140475

安装Tracing Feature并配置想要监测的错误类型。

IIS中ErrorLog的默认路径是C:\inetpub\logs\FailedReqLogFiles\W3SCV<num>\fr<6-digit-num>.xml,所以在后面logstash需要解析的将是XML文件。

注意,在Add Failed Request Tracing Rule的最后一步可能会出现权限问题

   Error: Cannot Write Configuration File due to Insufficient Permissions

这并不是用户权限不够,即便是以管理员身份操作也会出现这个错误。真实原因是相应的Web.config文件被设为了只读,所以只需要右键取消制度设置就好。

具体参见 http://blog.csdn.net/salmonellavaccine/article/details/50140505


二、安装ELK

在Windows Server上安装ELK的教程参见 http://blog.csdn.net/salmonellavaccine/article/details/50140419

这里面需要注意的是,logstash需要从下载包中解压缩,不能直接copy解好压缩的文件夹,否则会出现一个Unable to find JRuby的错误,具体原因还不是太清楚,参见

http://stackoverflow.com/questions/33621206/logstash-unable-to-find-jruby


具体到这个项目,E和K是已经在别的服务器上配置好了的,所以教程里面只需要用到logstash相关的步骤,也就是1-5,12,13。

如果还需要安装配置E和K的话,要注意ELK三者之间的版本需要相互匹配。


三、配置Logstash

先把配置文件的代码贴上来 https://gist.github.com/shaosh/79e307e3b31742b79f5b

首先在Windows Server上用logstash来处理IIS日志的就没多少,用其来解析XML的就更少了。即便用,大部分搜到的资源要么是自己写ruby代码,要么是用grok或者其他插件,用xml这个插件的并不多。

所以说,上面那个gist包含着本人无数的血汗,看了无数遍的logstash文档,搜了无数的博客和stackoverflow,删了无数遍的.sincedb,做了无数遍测试才搞出来的。

里面需要注意的几个要点:

关于input

1. XML是多行文件,每个XML中只包含一个错误。logstash默认每一行为一个event,所以需要用multiline这个插件把每个XML中的所有行合并成一个event。

2. multiline是多线程,filter不是线程安全的,所以multiline必须要写在input里,而不能写在filter里。

3. 本来想用</failedRequest>作为multiline的pattern,但是不知道什么原因这个regex不起作用,</failedRequest>也从来没有出现在message的任何一部分中,用这个来做pattern只能解析一个xml,然后就停止了。

4. multiline中的negate => true和what => "previous"的意思是如果当前行不匹配pattern,则把当前行并入之前已有的字符串,如此重复知道遇到能够匹配pattern的行为止。

5. max_line这一行默认是500,而我需要解析的xml日志至少有5000行,多者10000多行,所以这个数字需要设置的足够大,以使这个XML被完整地包含在一个event中,否则一个xml会被分成多个event,这样的话Kibana中显示出来的错误数量就会凭空多出几倍。

6. sincedb记录了现在logstash所监视的log文件的地址和读取的位置。如果不设置start_position,这个读取位置会默认是文件末尾,那么这个文件就不会再被读取。只有把start_position设成"beginning",logstash在运行的时候才会读取其中的信息。这也是为什么在测试的时候,每一遍测试之前都需要把这个.sincedb文件删除,才能使logstash读取已经存在了的log文件。


关于filter

1. xml插件中,要使用xpath来提取所需的信息。我需要的是url,appPoolId,verb和statusCode这几个属性,所以就写出相应的xpah,在后面跟上存储这些数据的变量名。url, appPoolId, verb和statusCode这几个变量会被添加到output中并被kibana显示出来。

2. log文件在被input的file插件读取之后,其内容会被默认存在message这个field中,所以source => "message"。

3. targe似乎不是必须的,这个我没有仔细研究。

4. 如前所述,xml文件很冗长,有5000-10000行,这些数据被存在message中,最后也会被kibana显示出来。其内容大部分是我所不需要的,所以用mutate remove_field删掉了。


关于output

这部分很简单。elasticsearch插件用于把filter过滤出来的数据存入es之中,设置hosts和index两个属性足矣,之后在kibana中查询这个index就可以看到相应的数据。

stdout用来在cmd中输出得到的数据,file则用于把这些数据写入文件中。


有一点需要注意的是,最初的时候logstash只能向es发送我本地13个xml文件中的一个xml中的数据,后来我查了查文档加上了flush_size => 1这个属性,只能固定的发送其中4个的数据。后来做了些其他更改(实在是记不清楚做了哪些更改了),最后又把这句话去掉了,然后程序就正常了,所有数据都能够被发送并显示了。

http://stackoverflow.com/questions/30004463/using-logstash-to-parse-multiple-files-but-cant-parse-the-last-file


至于为什么,我也不明白,就像下面这幅图一样

http://thecodinglove.com/post/49761335518/changed-one-line-of-code-bug-is-fixed


四、在服务器上自动运行

参见 http://blog.csdn.net/salmonellavaccine/article/details/50140419中的第12和13步进行配置,这样,特别是每次重启后,就不用手动输入logstash agent -f logstash.conf来运行logstash了。


如果需要移除某个服务,参见 http://stackoverflow.com/questions/76074/how-can-i-delete-a-service-in-windows。


五、其他参考过的连接

https://www.elastic.co/guide/en/logstash/current/plugins-filters-xml.html

https://www.elastic.co/guide/en/logstash/current/plugins-filters-multiline.html

https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html

https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html

https://www.elastic.co/guide/en/logstash/current/plugins-filters-drop.html

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html

http://www.cnblogs.com/yasin/archive/2009/07/20/1527013.html

http://yeejlan.github.io/2014/07/15/log-collection-using-logstash-elasticsearch-and-kibana/

http://blog.chinaunix.net/uid-532511-id-4845841.html

http://www.xyula.com/tool/2015/05/12/logstash-usage/

http://kibana.logstash.es/content/

http://blog.kazaff.me/2015/06/05/%E6%97%A5%E5%BF%97%E6%94%B6%E9%9B%86%E6%9E%B6%E6%9E%84--ELK/

http://fangjian0423.github.io/2014/11/01/logstash_build/

https://www.rizhiyi.com/docs/howtouse/multiline.html

http://www.sixtree.com.au/articles/2014/intro-to-elk-and-capturing-application-logs/

https://discuss.elastic.co/t/how-could-i-set-index-type-at-logstash/985

http://devquestion.tk/32723643/logstash-multiline-xml-filter.html

http://serverfault.com/questions/615196/logstash-parsing-xml-document-containing-multiple-log-entries

https://twentymegahertz.wordpress.com/2015/09/08/making-the-logstash-file-plugin-work-on-windows/

http://stackoverflow.com/questions/21438697/logstash-conditional-to-check-if-tag-exists

http://stackoverflow.com/questions/24017357/reading-files-from-multiple-directories-in-logstash

https://logstash.jira.com/browse/LOGSTASH-1615

http://stackoverflow.com/questions/26006826/can-i-delete-the-message-field-from-logstash

http://stackoverflow.com/questions/21230035/how-to-use-sincedb-in-logstash

https://github.com/logstash-plugins/logstash-filter-xml/issues/11

https://github.com/elastic/logstash/issues/2498

http://stackoverflow.com/questions/5615296/cannot-read-configuration-file-due-to-insufficient-permissions

https://discuss.elastic.co/t/parsing-xml-files-using-logstash/25372

http://blog.csdn.net/zgkli6com/article/details/17491479

http://logstash-users.narkive.com/OtD0vFzr/logstash-parse-xml

http://www.cnblogs.com/buzzlight/p/logstash_elasticsearch_kibana_log.html

http://stackoverflow.com/questions/25668970/cant-parse-xml-input-with-logstash-filter

http://stackoverflow.com/questions/30129785/how-to-parse-xml-log-file-in-logstash

https://gist.github.com/derickson/83022e9c5154165ff975

https://gist.github.com/harlanbarnes/2228474

http://stackoverflow.com/questions/31353868/parsing-xml-files-to-logstash

  相关解决方案