使用logstash和Windows文件使用grokfilter发出问题

我正在尝试使用Logstash和grok过滤sql服务器错误日志。 Logstash 1.3.3作为使用NSSM和JRE6的Windows服务运行。 我的configuration文件如下

input { file { path => "c:\program files\microsoft sql server\mssql10_50.mssqlserver\mssql\log\errorlog" type => SQLServerLog start_position => "beginning" codec => plain { charset => "UTF-8" } } } filter { grok { type => "SQLServerLog" match => [ "message", "%{DATESTAMP:DateStamp} %{WORD:Process} %{GREEDYDATA:Message}" ] named_captures_only => true singles => true remove_tag => [ "_grokparsefailure" ] add_tag => [ "GrokFilterWorked" ] } } output { stdout { codec => rubydebug } elasticsearch { embedded => true } } 

以下是日志文件内容的示例。

 2014-01-31 00:00:38.73 spid21s This instance of SQL Server has been using a process ID of 14632 since 28/01/2014 13:09:24 (local) 28/01/2014 13:09:24 (UTC). This is an informational message only; no user action is required. 

事件在Kibana中可见,但是在折叠时,消息显示为{“message”:“\ u00002 \ u00000 \ u00001 \ u00004 …

展开时,表视图将事件消息显示为文本。 查看事件的原始数据如下。

 { "_index": "logstash-2014.01.31", "_type": "SQLServerLog", "_id": "NpvKSf4eTFSHkBdoG3zw6g", "_score": null, "_source": { "message": "\u00002\u00000\u00001\u00004\u0000-\u00000\u00001\u0000-\u00003\u00000\u0000 \u00000\u00000\u0000:\u00000\u00000\u0000:\u00002\u00001\u0000.\u00006\u00004\u0000 \u0000s\u0000p\u0000i\u0000d\u00002\u00004\u0000s\u0000 \u0000 \u0000 \u0000 \u0000 \u0000T\u0000h\u0000i\u0000s\u0000 \u0000i\u0000n\u0000s\u0000t\u0000a\u0000n\u0000c\u0000e\u0000 \u0000o\u0000f\u0000 \u0000S\u0000Q\u0000L\u0000 \u0000S\u0000e\u0000r\u0000v\u0000e\u0000r\u0000 \u0000h\u0000a\u0000s\u0000 \u0000b\u0000e\u0000e\u0000n\u0000 \u0000u\u0000s\u0000i\u0000n\u0000g\u0000 \u0000a\u0000 \u0000p\u0000r\u0000o\u0000c\u0000e\u0000s\u0000s\u0000 \u0000I\u0000D\u0000 \u0000o\u0000f\u0000 \u00001\u00004\u00006\u00003\u00002\u0000 \u0000s\u0000i\u0000n\u0000c\u0000e\u0000 \u00002\u00008\u0000/\u00000\u00001\u0000/\u00002\u00000\u00001\u00004\u0000 \u00001\u00003\u0000:\u00000\u00009\u0000:\u00002\u00004\u0000 \u0000(\u0000l\u0000o\u0000c\u0000a\u0000l\u0000)\u0000 \u00002\u00008\u0000/\u00000\u00001\u0000/\u00002\u00000\u00001\u00004\u0000 \u00001\u00003\u0000:\u00000\u00009\u0000:\u00002\u00004\u0000 \u0000(\u0000U\u0000T\u0000C\u0000)\u0000.\u0000 \u0000T\u0000h\u0000i\u0000s\u0000 \u0000i\u0000s\u0000 \u0000a\u0000n\u0000 \u0000i\u0000n\u0000f\u0000o\u0000r\u0000m\u0000a\u0000t\u0000i\u0000o\u0000n\u0000a\u0000l\u0000 \u0000m\u0000e\u0000s\u0000s\u0000a\u0000g\u0000e\u0000 \u0000o\u0000n\u0000l\u0000y\u0000;\u0000 \u0000n\u0000o\u0000 \u0000u\u0000s\u0000e\u0000r\u0000 \u0000a\u0000c\u0000t\u0000i\u0000o\u0000n\u0000 \u0000i\u0000s\u0000 \u0000r\u0000e\u0000q\u0000u\u0000i\u0000r\u0000e\u0000d\u0000.\u0000\r\u0000", "@version": "1", "@timestamp": "2014-01-31T08:55:03.373Z", "type": "SQLServerLog", "host": "MyMachineName", "path": "C:\\Program Files\\Microsoft SQL Server\\MSSQL10_50.MSSQLSERVER\\MSSQL\\Log\\ERRORLOG" }, "sort": [ 1391158503373, 1391158503373 ] } 

我不确定邮件的编码是否阻止Grok正确地过滤它。

我希望能够使用Grok过滤这些事件,我不确定如何继续。

更多信息:

我创build了一个UTF-8的日志文件的副本,filter工作正常。 所以这绝对是一个字符集问题。 我想我需要确定日志文件正确的字符集是什么,它应该工作。

所以我在阅读SQL server日志文件时遇到同样的问题。

然后我意识到,SQL server会将相同的条目记录到Windows事件日志中,logstash支持该事件作为输入。

SQL server在我的系统上使用“MSSQLSERVER”源记录条目。 您将需要logstash-contrib软件包,只需将内容提取到Windows盒子上的基本logstash文件(无论何处运行logstash以收集数据)。

我有我的logstash代理程序配置为简单地将条目发运到一个Linux框上的另一个logstash实例,做一些其他的东西不相关的这个问题;)

示例logstash.conf:

 input { eventlog { type => "Win32-EventLog" logfile => ["Application", "Security", "System"] } } filter { if "MSSQLSERVER" in [SourceName] { # Track logon failures grok { match => ["Message", "Login failed for user '%{DATA:username}'\..+CLIENT: %{IP:client_ip}"] } dns { action => "append" resolve => "client_ip" } } } output { stdout { codec => rubydebug } tcp { host => "another-logstash-instance.local" port => "5115" codec => "json_lines" } } 

希望这可以帮助。