0

我遇到了一个我试图用 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”
            集群=>“日志”
        }
    # 标准输出 { 编解码器 => ruby​​debug }
        }
    }

示例 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服务器之前从用户名中删除了反斜杠。

4

1 回答 1

0

我认为是同一个问题。您应该禁用默认的反斜杠转义字符:

EscapeChar 0x00
于 2015-05-11T22:20:44.963 回答