最近在做一个项目,就是把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