我遇到了一个我试图用 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服务器之前从用户名中删除了反斜杠。