现阶段Logstash在Windows端的日志采集一直存在若干问题,包括:
 
1. LS有读锁:进程开启后Input指定路径下的所有文件都会被锁死无法重命名或删除。
2. LS不识别*:如果在path上使用“*”的话,sincedb会失效,所有日志都会从文件开始处重新读取(类似start_position => beginning)。
 
社区​里关于这些历史问题也是一抓一大把,贴下主要的几个贴:
[LOGSTASH-429] File Input - .sincedb file is broken on Windows
[LOGSTASH-578] Logstash Agent lock file inputs on Windows - Python LOG rotate failed
[LOGSTASH-986] File Locking in Windows(Rolling logs, etc.)
[LOGSTASH-1587] Windows - file input - sincedb / start_position is ignored
[LOGSTASH-1801] Input File Rotation in Logstash
 
当然,开发者也一直在努力修复这些问题,这两个月貌似有了不少进展,Jordan并号称LS1.5将会修复这个BUG,那就让我们欢呼等待吧:)
Release a gem with windows support #39
File Locking in Windows(Rolling logs, etc.) #1557

 
那么,问题来了,在现有的LS1.4.2版本上,如何在生产环境上对日志进行采集呢?
 
阿婆主采用的办法是每周日凌晨执行计划任务,关闭LS服务,删除除了当天以前其他所有的IIS日志,然后再启动。这样就保证了IIS日志不会无法被删除,且重启后即使重复读也不会重复读太多文件而影响性能。
不过这样部署起来的成本比较大,需要一台台上去装啊改的,觉得麻烦的话还是考虑下NXLOG方式进行采集,之后阿婆主也会提到如何使用nxlog来采集IIS日志。
 
***小小分割线***
 
以下附上配置文档(安装部署文档本篇暂不涉及,需要的话可私信):
  • LS客户端配置文件
input中使用file及eventlog模块分别对IIS及Windows Event Log进行采集;filter中用grok对日志进行分隔处理;output将过滤后的日志传至redis。
input {
  file {
    type => "IIS"
    path => "D:\iislog\xxx.xxx.com\W3SVC663037409/*.log"
    codec => plain {
charset => "ISO-8859-1"
    }
  }
}
 
input {
  eventlog {
    type => 'Win32-EventLog'
    logfile => ["Application", "System", "Security"]
  }
}
 
filter {
  #ignore log comments
  if [message] =~ "^#" {
    drop {}
  }
 
  grok {
    # check that fields match your IIS log settings
    match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} (%{WORD:s-sitename}|-) (%{IPORHOST:s-ip}|-) (%{WORD:cs-method}|-) %{NOTSPACE:cs-uri-stem} %{NOTSPACE:cs-uri-query} (%{NUMBER:s-port}|-) (%{IPORHOST:c-ip}|-) %{NOTSPACE:cs-useragent} %{NOTSPACE:cs-referer} %{NOTSPACE:cs-host} (%{NUMBER:sc-status}|-) (%{NUMBER:sc-bytes}|-) (%{NUMBER:cs-bytes}|-) (%{NUMBER:time-taken}|-)"]
  }
  #Set the Event Timesteamp from the log
date {
    match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
 timezone => "Etc/UCT"
  }
  mutate {
remove_field => [ "log_timestamp"]
convert => [ "sc-bytes", "float" ]
convert => [ "cs-bytes", "float" ]
convert => [ "time-taken", "float" ]
  }
}
 
output {
    #stdout { codec => rubydebug }
    redis {
    host => "192.168.xx.xxx"
    data_type =>"list"
    key => "test:redis"
   }
}
注意:
1. charset是为了解决logstash字符集的问题,如果按默认值“UTF-8”可能还是无法识别一些特殊字体,而修改为“ISO-8859-1”后便可以正确的读入了:
←[33mReceived an event that has a different character encoding than you configured. {:text=>"2014-12-22 14:22:52 /newDict/jp/improve_new.aspx sourcedict=1&jid=322316&wtype=jc&w=\\xCD?\\xFC 192.168.31.190 HTTP/1.1 Mozilla/4.0 - dict.hjenglish.com 200 5043 342\\r", :expected_charset=>"UTF-8", :level=>:warn}←[0m[33mInterrupt received. Shutting down the pipeline. {:level=>:warn}←[0m

2. 如果要调用eventlog模块,必须安装“contrib plugins”,否则服务无法启动:

报错:“LoadError: no such file to load -- jruby-win32ole”

3. 针对数值型字段,必须使用mutate中的convert强制转换字段类型,否则还是字符型,ES后期无法对其使用聚集方法(mean/total/max/etc.)
报错:

ELK日志错误:

[2015-01-07 11:43:02,464][DEBUG][action.search.type       ] [Prester John] [logstash-2015.01.07][0], node[wL6TfFyxQI2fmsDWHI-bdA], [P], s[STARTED]: Failed to execute [org.elasticsearch.action.search.SearchRequest@61fc4bf9] lastShard [true]

org.elasticsearch.search.SearchParseException: [logstash-2015.01.07][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [{"facets":{"0":{"date_histogram":{"key_field":"@timestamp","value_field":"time-taken","interval":"1s"},"global":true,"facet_filter":{"fquery":{"query":{"filtered":{"query":{"query_string":{"query":"cs-host:(dict.*)"}},"filter":{"bool":{"must":[{"range":{"@timestamp":{"from":1420601882243,"to":1420602182243}}},{"terms":{"s-ip.raw":["192.168.33.31"]}}]}}}}}}}},"size":0}]]

at org.elasticsearch.search.SearchService.parseSource(SearchService.java:681)

at org.elasticsearch.search.SearchService.createContext(SearchService.java:537)

at org.elasticsearch.search.SearchService.createAndPutContext(SearchService.java:509)

at org.elasticsearch.search.SearchService.executeQueryPhase(SearchService.java:264)

at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:231)

at org.elasticsearch.search.action.SearchServiceTransportAction$5.call(SearchServiceTransportAction.java:228)

at org.elasticsearch.search.action.SearchServiceTransportAction$23.run(SearchServiceTransportAction.java:559)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.ClassCastException: org.elasticsearch.index.fielddata.plain.PagedBytesIndexFieldData cannot be cast to org.elasticsearch.index.fielddata.IndexNumericFieldData

at org.elasticsearch.search.facet.datehistogram.DateHistogramFacetParser.parse(DateHistogramFacetParser.java:199)

at org.elasticsearch.search.facet.FacetParseElement.parse(FacetParseElement.java:93)

at org.elasticsearch.search.SearchService.parseSource(SearchService.java:665)

... 9 more

未使用convert前:

字段类型转换后:

4. 对于无法正确获得客户端IP而取到了前端HAProxy或F5或CDN的IP地址的话,需要使用“X-Forwarded-For”,可以看下F5官方提供的文档:
https://devcentral.f5.com/articles/x-forwarded-for-log-filter-for-windows-servers
 
5. 如何对grok表达式进行调试,三斗室大大也早有过介绍了,另外评论区1楼有彩蛋:
http://chenlinux.com/2014/10/19/grokdebug-commandline/
 
6. IIS日志域必须与grok中的配置项精确匹配,否则会出现grok匹配失败,返回“_grokparsefailure”的情况:


补充一下:在这里如何使用powershell对IIS日志域进行批量更改,阿婆主研究了一下午还是没弄出来,希望有相关经验的朋友给予下帮助哈~
 
  • LS服务端配置
input中用到redis模块导入日志,output中用elasticsearch模块将消息导至ES。
input {
  redis {
    host => '192.168.xx.xxx'
    data_type => 'list'
    port => "6379"
    key => 'test:redis'
    type => 'redis-input'
        }
}
output {
  elasticsearch {
    host => "192.168.xx.xxx"
    port => "9300"
                }
}
 
  • 批处理脚本导入计划任务
addTask.bat
schtasks /create /tn "LSRestartIISDel" /tr D:\scripts\logstash\LSRestartIISDel.bat /sc weekly /mo 1 /d SUN /st 03:00 /ru system
pause

注意:Windows Server 2003需要安装补丁(需重启),否则只能手动添加。
 
  • 批处理脚本每周删除IIS日志
LSRestartIISDel.bat
:: Due to LogStash Bug, LS process will lock IIS file until process stopped, however IIS log need to be deleted everyday, so we need stop LS, delete the log and start LS manually.
:: Create Date#2015-01-07#zhoufeng
:: Ver1.0
 
@echo off
 
:: stop LS Service
NET STOP logstash
 
:: delete iis log before 1 days
:: CHANGE IIS LOG PATH BEFORE USING IT!!
forfiles -p "D:\iislog\xxx.xxx.com\W3SVC663037409" /s /m *.log /c "cmd /c del @path" /d -1
 
:: start service
NET START logstash
注意:删除的路径必须手动修改!
 
***神秘分割线***
 
参考文档:
[Link] Using Logstash to Analyse IIS Log Files with Kibana
[Link] Logstash: Received an event that has a different character encoding
[Link] Win32-EventLog input throwing "LoadError: no such file to load -- jruby-win32ole"
[Link] Kibana 中文指南 - histogram by 三斗室
[Link] chenryn/logstash-best-practice-cn/input/file.md by 三斗室

【Logstash系列】使用Logstash作为收集端采集IIS日志的更多相关文章

  1. elk系列3之通过json格式采集Nginx日志【转】

    转自 elk系列3之通过json格式采集Nginx日志 - 温柔易淡 - 博客园http://www.cnblogs.com/liaojiafa/p/6158245.html preface 公司采用 ...

  2. elk系列3之通过json格式采集Nginx日志

    preface 公司采用的LNMP平台,跑着挺多nginx,所以可以利用elk好好分析nginx的日志.下面就聊聊它吧. 下面的所有操作都在linux-node2上操作 安装Nginx nginx是开 ...

  3. 利用Flume采集IIS日志到HDFS

    1.下载flume 1.7 到官网上下载 flume 1.7版本 2.配置flume配置文件 刚开始的想法是从IIS--->Flume-->Hdfs 但在采集的时候一直报错,无法直接连接到 ...

  4. ElasticSearch实战系列七: Logstash实战使用-图文讲解

    前言 在上一篇中我们介绍了Logstash快速入门,本文主要介绍的是ELK日志系统中的Logstash的实战使用.实战使用我打算从以下的几个场景来进行讲解. 时区问题解决方案 在我们使用logstas ...

  5. 通过filebeat、logstash、rsyslog采集nginx日志的几种方式

    由于nginx功能强大,性能突出,越来越多的web应用采用nginx作为http和反向代理的web服务器.而nginx的访问日志不管是做用户行为分析还是安全分析都是非常重要的数据源之一.如何有效便捷的 ...

  6. logstash采集tomcat日志、mysql错误日志

    input{ file { path => "/opt/Tomcat7.0.28/logs/*.txt" start_position => "beginni ...

  7. Logstash 收集 IIS 日志

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

  8. Logstash IIS日志采集

    Logstash IIS 日志采集,跟Linux上运行差不多,都需要java运行环境,装个jdk就好了,对于IIS日志暂时未处理X-forward-for,纠结怎么弄当中,貌似要装个插件,慢慢研究. ...

  9. 第八章·Logstash深入-通过TCP/UDP收集日志

    1.收集TCP/UDP日志 通过logstash的tcp/udp插件收集日志,通常用于在向elasticsearch日志补录丢失的部分日志,可以将丢失的日志通过一个TCP端口直接写入到elastics ...

随机推荐

  1. Photobucket不能用了怎么办?推荐10个在线图片储存服务!

    近日,图片共享服务网站Photobucket更新了政策,要求用户缴纳399美元的年费,才能使用第三方网站图片储存服务. 由于Photobucket出台这一政策,亚马逊及其他电商平台上相关的产品图片已被 ...

  2. Node.JS + Mysql数据库

    服务嘛,当然离不开数据库了,你要是见到数据就哭了,我建议你还是看看本文,不要做数据哭啊,哈哈哈 要做 ‘数据酷’嘛,哈哈哈 一 安装 1. wget -i -c http://dev.mysql.co ...

  3. java基础(一) -语法

    基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...

  4. Struts2第三天

    ## Struts2第三天 ## ---------- **课程回顾:Struts2框架的第二天** 1. Servlet的API * ActionContext对象 * ServletActionC ...

  5. 编写一个程序解决选择问题。令k=N/2。

    import java.util.Arrays; /** * 选择问题,确定N个数中第K个最大值 * @author wulei * 将前k个数读进一个数组,冒泡排序(递减),再将剩下的元素逐个读入, ...

  6. DataGridView控件用法一:数据绑定

    使用DataGridView控件,可以显示和编辑来自多种不同类型的数据源的表格数据. 将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可.在绑 ...

  7. 第二章 CSS基本属性

    1.CSS:层叠样式表 一个元素允许同时应用多种样式,页面元素最终的样式即为多种样式的叠加效果. 2.CSS样式优先级 行内样式表>内部样式表>外部样式表[就近原则] id选择器>类 ...

  8. c#之如何转换文本文件编码格式为utf-8

    如代码: string content = File.ReadAllText(path, Encoding.Default); File.WriteAllText(path, content, Enc ...

  9. yii2验证密码->手机号码短信发送>手机短信发送频繁问题

    <?php namespace frontend\models; use Yii; use yii\base\Model; class ChangeMobileSendRequestForm e ...

  10. RobotFrameWork(十三)RobotFramework与loadrunner性能测试结合(基于Remote库)

    一般我们进行完功能测试,都需要进行下性能测试,那么这章我来介绍下,RobotFramework与loadrunner性能测试的融合,即运行完自动化功能测试,借助RobotFramework的Remot ...