logstash(三):过滤器与grok

本文介绍了如何在Logstash中使用过滤器(filter)与grok结合解析数据。通过正则表达式,包括内置和自定义,提取所需信息。文章提供了一个具体的grok使用示例,并建议使用在线工具进行正则表达式测试。同时,文章还提及了数据类型转换,如将字符串转为整数,并展示了完整的Logstash配置文件。最后,针对操作过程中可能遇到的问题,如文件数量限制和Elasticsearch连接问题,给出了相应的解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在logstash中,配置完输入数据流后,接下来就是对数据进行解析,最简单的方法莫过于使用过滤器(filter)与grok的组合。

在grok中,支持以正则表达式的方式提取所需要的信息,其中,正则表达式又分两种,一种是内置的正则表达式(可以满足我们大部分的要求),一种是自定义的正则表达式,形式分别如下:

# 内置的正则表达式方式,下面的写法表示从输入的消息中提取IP字段,并命名为sip
%{IP:sip}
# 自定义的正则表达式,开始与终止符分别为(?与?),下面的写法表示获取除,以外的字符,并命名为log_type
(?<log_type>[^,]+?)

以一个具体的例子来说明grok用法,假定需要解析的消息内容样本如下:

日志类型:僵尸网络日志, 源IP:192.168.101.251, 源端口:63726, 目的IP:124.127.48.41, 目的端口:1390, 攻击类型:异常流量, 严重级别:低, 系统动作:被记录, URL:-\n

为了快速判断我们的正则表达式是否正确,不妨进行在线测试,地址为(在线测试地址)[http://grokdebug.herokuapp.com/],最后的结果为:

^日志类型:(?<log_type>[^,]+?), 源IP:%{IP:sip}, 源端口:%{NUMBER:sport:int}, 目的IP:%{IP:dip}, 目的端口:%{NUMBER:dport:int}, 攻击类型:(?<att_type>[^,]+?), 严重级别:(?<slevel>[^,]{1,}?), 系统动作:(?<sys_act>[^,]{1,}?), URL:(?<url>.+)$

在上面的表达式中,为了提高正则表达式的解析效率,我们需要进行整行匹配,于是添加了正则表达式的开始与结尾字符“^$”,此外为了便于统计与分析,我们还需要对相关类型进行转换(如将字符串转换为整数),例如我们所需要的端口为整数,表达式为%{NUMBER:dport:int}。需要注意的是,grok也就支持两种数据类型转换,分别为float与int。

完整的logstash配置文件如下所示。

input {
    # 监听syslog输出端口
    syslog {
        port => "514"
    }
}

filter {
    grok {
        match => {
            "message" => [
                "^日志类型:(?<log_type>[^,]+?), 源IP:%{IP:sip}, 源端口:%{NUMBER:sport:int}, 目的IP:%{IP:dip}, 目的端口:%{NUMBER:dport:int}, 攻击类型:(?<att_type>[^,]+?), 严重级别:(?<slevel>[^,]{1,}?), 系统动作:(?<sys_act>[^,]{1,}?), URL:(?<url>.+)$",
                "^日志类型:(?<log_type>[^,]+?), 应用类型:(?<p_type>[^,]+?), 用户名/主机:%{IP:sport}, 上行流量\(KB\):%{NUMBER:sflow:int}, 下行流量\(KB\):%{NUMBER:dflow:int}, 总流量\(KB\):%{NUMBER:all_flow:int}$"
            ]
        }
    }   
}

output {
    stdout {
        codec => rubydebug
    }
    elasticsearch {
        #   elasticsearch的服务地址
        hosts => ["192.168.101.204"]
        index => "logstash-%{+YYYY.MM.dd}"
        ssl => false
    }
}

在操作的过程中,相关问题的解决办法:

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

文件数量限制的解决办法:

#   设置虚拟内存的数量
sysctl -w vm.max_map_count=999999
#   设置进程可打开的文件数量
ulimit -n 999999

无可用连接的错误信息:

[2017-08-08T02:32:08,035][ERROR][logstash.outputs.elasticsearch] 
Attempted to send a bulk request to elasticsearch, 
but no there are no living connections in the connection pool.
Perhaps Elasticsearch is unreachable or down?
{:error_message=>"No Available connections", :class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::NoConnectionAvailableError", :will_retry_in_seconds=>32}

解决办法:
1. 仔细检查配置文件的elasticsearch的服务地址;
2. 仔细检查elasticsearch是否开放了跨域设置;

Grok过滤器Logstash中一种用于解析和匹配日志消息的工具。它使用正则表达式来匹配文本模式,并将匹配的值存储在新字段中。然而,当模式不匹配时,Grok过滤器可能会遇到性能问题。为了解决这个问题,可以考虑改用基于分隔符的Dissect过滤器,它比基于正则表达式过滤器更容易编写和使用。不幸的是,目前还没有针对此的应用程序。要使用Grok过滤器,可以在配置文件中指定字段名称和匹配模式,如: ``` filter { grok { match => [ "message", "%{USERNAME:user}" ] } } ``` 这将从"message"字段中提取匹配的用户名,并将其存储在新的"user"字段中。另一方面,如果想在Logstash中改变应用程序的日志记录模式,可能会增加直接日志读取的困难。在这种情况下,可以考虑使用Logstash的Dissect过滤器,并进行相应的配置。一个可能的配置示例如下: ``` filter { dissect { mapping => { "message" => ... } } mutate { strip => [ "log", "class" ] } } ``` 这个配置将使用Dissect过滤器根据指定的映射将日志消息拆分成多个字段,并通过mutate过滤器删除不需要的字段,例如"log"和"class"。综上所述,Grok过滤器Logstash中用于解析和匹配日志消息的一种工具,而Dissect过滤器则是一种更简单易用的基于分隔符的过滤器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Logstash:如何使用 Logstash Grok 过滤器提取模式](https://blog.youkuaiyun.com/UbuntuTouch/article/details/107512971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值