使用带有日志存储和windows文件的grok筛选器时出现问题
我正在尝试使用Logstash和grok筛选sql server错误日志。Logstash 1.3.3作为windows服务运行,使用NSSM和JRE6。我的配置文件在下面使用带有日志存储和windows文件的grok筛选器时出现问题,windows,logstash,kibana,logstash-grok,Windows,Logstash,Kibana,Logstash Grok,我正在尝试使用Logstash和grok筛选sql server错误日志。Logstash 1.3.3作为windows服务运行,使用NSSM和JRE6。我的配置文件在下面 input { file { path => "c:\program files\microsoft sql server\mssql10_50.mssqlserver\mssql\log\errorlog" type => SQLServerLog st
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中可见,但当折叠时,消息显示为{“消息”:“\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的日志文件副本,过滤器工作正常。因此,这肯定是一个字符集问题。我想我需要确定日志文件的正确字符集是什么,它应该工作。因此,我在读取SQL Server日志文件时遇到了同样的问题 然后我意识到SQL Server将把相同的条目记录到Windows事件日志中,logstash支持将其作为输入 SQL Server使用“MSSQLSERVER”源在我的系统上记录条目。您将需要该软件包,只需在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"
}
}
希望这有帮助。您知道输入文件的编码方式吗?您可以应用编解码器(例如)使用自定义
字符集
选项。除此之外,我发现一些信息提示LS试图从主机环境确定预期编码。如果您无法找到帮助,这里,freenode上的Logstash IRC通道可能很方便。感谢您的回复。我添加了编解码器和字符集,它仍然显示为ying搞笑。更新了带有更改的问题,解决了相同的问题。SQL Server errorlog正在UTF-16LE中编码,但在普通编解码器中指定为“charset”参数似乎会解码第一行条目,但随后以{“message”=>“\u3100\u3100\u3100”失败之后,似乎是logstash内部的一个奇怪问题。