使用grok过滤器与logstash和Windows文件的问题

时间:2014-01-31 11:17:21

标签: windows logstash kibana logstash-grok

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

下面
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过滤这些事件,并且不确定如何继续。

更多信息:

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

1 个答案:

答案 0 :(得分:1)

因此我在阅读SQL Server日志文件时遇到了同样的问题。

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

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"
  }  
}

希望这有帮助。