现阶段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. LR、Poly2、FM、FFM

    1. LR LR的linear Margin: 假设特征之间是相互独立的,忽略了feature pair等高阶信息:在LR中,特征组合等高阶信息是通过特征工程在特征侧引入的,那么有哪些模型不需要通过特 ...

  2. 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。

    将项目部署到服务器后发现有如下问题,查了网上好多说是需要被序列化的类没有写上[Serializable]标志,所以把全部需要序列化的列都写上了标志发现还是不是,最后查到了发现网上说的并不太准确,而是需 ...

  3. UGUI之Image使用以及技能释放CD

    顾名思义:Image就是用来显示图片的 Image中Image组件中有一个重要的熟悉:Image type

  4. PHP开启mysqli扩展

    Call to undefined function mysqli_connect()解决这个问题需要开启mysqli扩展开启mysqli扩展需要这两个步骤缺一不可1.在php.ini中搜索php_m ...

  5. 如何解决“504 Gateway Time-out”错误

    做网站的同学经常会发现一些nginx服务器访问时候提示504 Gateway Time-out错误,一般情况下是由nginx默认的fastcgi进程响应慢引起的,但也有其他情况,这里我总结了一些解决办 ...

  6. 005-IIS处理过程

    PipeLine调用过程ISAPIRuntime ProcessReqeustHttpRuntime ProcessRequestNoDemand ProcessRequestNow ProcessR ...

  7. 获取Sqlserver上一句语句执行后受影响的行数@@rowCount

    from:http://blog.163.com/rihui_7/blog/static/212285143201381343240404/ 返回受上一语句影响的行数. ROWCOUNT_BIG.&q ...

  8. 前端流程图jsplumb学习笔记

    1.这篇博客很好,另外两个是官网文档 http://www.cnblogs.com/leomYili/p/6346526.html https://jsplumbtoolkit.com/communi ...

  9. [11]Windows内核情景分析---设备驱动

    设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...

  10. 擠出線寬(Extrusion width),要怎麼設定?

    擠出線寬(Extrusion width),要怎麼設定? Slic3r的作者,把這邊的%設定,跟"層高"做連結.我個人認為擠出線寬,要以噴頭孔徑當做設定參考才好.層高應該只要設定成 ...