我遇到了一个我试图用 IIS 日志和 Elasticsearch 解决的问题。发生的事情是我在 IIS 日志中的用户名中有一个反斜杠 () 而不是正斜杠 (/)。当 Elasticsearch 返回名称时,它不再具有我希望在输入时被转义的 \。因此,在 Elasticsearch 或 Kibana 中查看结果时,用户名没有 \ 并且那里的斜杠被视为正则表达式。例如,用户名 abcd\bob 将作为 abcdob 返回。
我也相信这个问题将是我将 _grokparsefailure 标记添加到来自 IIS 的每个条目的原因。
有什么建议么?
我的 NXLOG 文件获取数据:
##请将ROOT设置为安装nxlog的文件夹,
## 否则将无法启动。
#define ROOT C:\Program Files\nxlog
定义根 C:\Program Files (x86)\nxlog
模块目录 %ROOT%\modules
缓存目录 %ROOT%\data
Pidfile %ROOT%\data\nxlog.pid
SpoolDir %ROOT%\data
日志文件 %ROOT%\data\nxlog.log
<扩展 json>
模块 xm_json
</扩展>
#<扩展 w3c>
#map iis 将字段记录到字段类型
# 模块 xm_csv
# 字段 $date, $time, $website, $serverip, $method, $url, $querystring, $port, $username, $clientip, $version, $useragent, $referer, $status, $substatus, $sc_win32_status, $sc_bytes, $cs_bytes, $time_taken
# FieldTypes 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,整数,整数,整数,整数,整数,整数
#
##字段 $date, $time, $website, $hostname, $serverip, $verb, $request, $querystring, $dstport, $user, $clientip, $httpversion, $useragent, $cookie, $referrer, $fqdn , $status, $substatus, $sc_win32_status, $sc_bytes, $cs_bytes, $time_taken
##FieldTypes 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,整数,整数,整数,整数,整数,整数
# 分隔符''
# QuoteChar '"'
# EscapeControl FALSE
# UndefValue -
#</扩展名>
<扩展 w3c>
#map iis 将字段记录到字段类型
模块 xm_csv
字段 $date, $time, $website, $hostname, $serverip, $verb, $request, $querystring, $dstport, $user, $clientip, $httpversion, $useragent, $cookie, $referrer, $fqdn, $状态,$substatus,$sc_win32_status,$sc_bytes,$cs_bytes,$time_taken
FieldTypes 字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,字符串,整数,整数,整数,整数,整数
分隔符 ''
</扩展>
# Nxlog 内部日志
<输入内部>
模块 im_internal
执行 $EventReceivedTime = 整数($EventReceivedTime) / 1000000; to_json();
</输入>
# Windows 事件日志
<输入事件日志>
# 对于 Windows Vista/2008 及更高版本,取消注释 im_msvistalog
模块 im_msvistalog
# 在 Windows XP/2000/2003 中取消注释 im_mseventlog
# 模块 im_mseventlog
执行 $EventReceivedTime = 整数($EventReceivedTime) / 1000000; to_json();
</输入>
<输入 iis 日志>
模块 im_file
文件'C:\inetpub\logs\LogFiles\W3SVC1\u_ex*.log'
ReadFromLast TRUE
执行 if $raw_event =~ /^#/ drop(); \
别的 \
{ \
w3c->parse_csv(); \
$EventTime = parsedate($date + " " + $time); \
to_json (); \
}
</输入>
<输出>
模块 om_tcp
主机日志。{域已删除}.com
端口 3515
</输出>
<输出 iis-out>
模块 om_tcp
主机日志。{域已删除}.com
端口 3516
</输出>
<路线1>
路径内部,事件日志 => 出
</路线>
<路线2>
路径 iis-logs => iis-out
</路线>
我的 Logstash.conf 文件:
输入 {
tcp {
端口 => 5000
类型=>“系统日志”
}
tcp {
类型=>“事件日志”
端口 => 3515
编解码器 => json_lines
}
tcp {
类型 => "iislog"
端口 => 3516
编解码器 => json_lines
}
}
筛选 {
如果 [类型] == "系统日志" {
摸索{
匹配 => { "消息" => "<%{POSINT:syslog_pri}>%{DATA:syslog_timestamp} %{DATA:syslog_program}\[%{NUMBER:syslog_pid}\]\: %{GREEDYDATA:syslog_message}" }
add_field => [ "received_at", "%{@timestamp}" ]
# add_field => [ "received_from", "%{@source_host}" ]
}
syslog_pri { }
日期 {
匹配 => [ "syslog_timestamp", "yyyy:MM:dd-HH:mm:ss" ]
}
如果“_grokparsefailure”不在 [tags] {
变异{
替换 => [ "@message", "%{syslog_message}" ]
}
}
变异{
删除 => [“syslog_message”,“syslog_timestamp”]
}
千伏{
来源 => "@message"
}
}
如果 [类型] == "事件日志" {
# 从 nxlog 传入的 Windows 事件日志
# EventReceivedTime 字段必须只包含数字,否则为无效消息
# if [EventReceivedTime] !~ /\d+/ { drop { } }
# grep {
# 匹配 => [ "EventReceivedTime", "\d+" ]
# }
变异{
# 小写一些总是大写的值
小写 => [“事件类型”、“文件名”、“主机名”、“严重性”]
}
变异{
# 将消息来源设置为消息内容
重命名 => [“主机名”,“@source_host”]
}
日期 {
# 将时间戳从整数转换为 UTC
匹配 => [ "EventReceivedTime", "UNIX" ]
}
变异{
# 将一些字段重命名为更有用的名称
重命名 => [ "消息", "@message" ]
重命名 => [“严重性”,“eventlog_severity”]
重命名 => [“SeverityValue”,“eventlog_severity_code”]
重命名 => [“频道”,“事件日志频道”]
重命名 => [ "SourceName", "eventlog_program" ]
重命名 => [ "SourceModuleName", "nxlog_input" ]
重命名 => [“类别”,“eventlog_category”]
重命名 => [ "EventID", "eventlog_id" ]
重命名 => [“记录编号”,“事件日志记录编号”]
重命名=> [“进程ID”,“事件日志PID”]
}
变异{
# 删除多余字段
删除 => [“SourceModuleType”、“EventTimeWritten”、“EventTime”、“EventReceivedTime”、“EventType”]
}
如果 [eventlog_id] == 4624 {
变异{
add_tag => [“广告登录成功”]
}
}
如果 [eventlog_id] == 4634 {
变异{
add_tag => [“广告注销成功”]
}
}
如果 [eventlog_id] == 4771 或 [eventlog_id] == 4625 或 [eventlog_id] == 4769 {
变异{
add_tag => [“广告登录失败”]
}
}
如果 [eventlog_id] == 4723 {
变异{
add_tag => [“广告密码更改”]
}
}
如果 [eventlog_id] == 4724 {
变异{
add_tag => [“广告密码重置”]
}
}
如果 [标签] 中的“广告登录成功”{
指标{
add_tag => [ "drop", "metric", "ad-logon-success" ]
仪表 => “广告登录成功指标”
}
}
如果 [标签] 中的“广告登录失败”{
指标{
add_tag => [ "drop", "metric", "ad-logon-failure" ]
仪表 => “广告登录失败指标”
}
}
}
如果 [类型] == "iislog"
{
摸索{
# match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:iisSite} %{IPORHOST:site} %{IP:hostip} %{WORD:method} %{URIPATH:page} %{NOTSPACE:查询字符串} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientip} %{NOTSPACE:httpversion} %{NOTSPACE:useragent} %{NOTSPACE:referer} %{NUMBER:status} %{NUMBER:sub-状态} %{NUMBER:win32-status} %{NUMBER:bytes-received} %{NUMBER:bytes-sent} %{NUMBER:time-taken}"]
match => ["message", "%{DATESTAMP:log_timestamp} %{WORD:sitename} %{HOSTNAME:computername} %{IP:hostip} %{URIPROTO:method} %{URIPATH:request} (?:%{ NOTSPACE:queryparam}|-) %{NUMBER:port} (?:%{NOTSPACE:username}|-) %{IP:clientip} %{NOTSPACE:httpversion} %{NOTSPACE:user-agent} (?:%{ NOTSPACE:cookie}|-) (?:%{NOTSPACE:referer}|-) (?:%{HOSTNAME:host}|-) %{NUMBER:status} %{NUMBER:sub-status} %{NUMBER:win32 -status} %{NUMBER:bytes-received} %{NUMBER:bytes-sent} %{NUMBER:time-taken}"]
}
用户代理 {
来源=>“用户代理”
}
#geoip {
# 来源 => "clientip"
#}
}
指标{
仪表 => “事件”
add_tag => [ "drop", "metric", "events-metric" ]
}
}
输出 {
如果“drop”不在 [tags] {
弹性搜索{
主机=>“127.0.0.1”
集群=>“日志”
}
# 标准输出 { 编解码器 => rubydebug }
}
}
示例 IIS 日志条目:
2015-05-06 15:41:18 W3SVC2 WEB1 10.11.10.137 GET /main/ - 80 ABCD\smith 10.11.11.127 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.3;+WOW64;+Trident/7.0;+Touch;+.NET4.0E;+.NET4.0C;+Tablet+PC+2.0;+.NET+CLR+3.5.30729;+.NET+CLR+2.0.50727;+.NET+CLR+3.0.30729;+InfoPath.3) cisession=a%3A4%3A%7Bs%3A10%3A%22session_id%22%3Bs%3A32%3A%22959e25c7a1663350eeb85edb676de096%22%3Bs%3A10%3A%22ip_address%22%3Bs%3A12%3A%2210.11.11.127%22%3Bs%3A10%3A%22user_agent%22%3Bs%3A120%3A%22Mozilla%2F4.0+%28compatible%3B+MSIE+7.0%3B+Windows+NT+6.3%3B+WOW64%3B+Trident%2F7.0%3B+Touch%3B+.NET4.0E%3B+.NET4.0C%3B+Tablet+PC+2.0%3B+.NET+CL%22%3Bs%3A13%3A%22last_activity%22%3Bi%3A1430926793%3B%7D08a40eacaf8b6eba6102c7746c35c46497a6502a http://my.domain.com/main/scheduling my.domain.com 200 0 0 11314 1009 1458
更新: 我添加了第二个 nxlog iis 输入/输出,而不是将数据输出到我的 logstash 服务器,而是输出到一个平面文件。
<输出 iis2-out>
模块 om_file
文件'C:\logs\logtest.txt'
</输出>
我检查了这个输出并注意到用户名在访问logstash服务器之前从用户名中删除了反斜杠。