logstash 6.3.2 filter 过滤器各种方法

本文介绍如何使用Logstash配置文件解析Nginx日志,并通过grok插件匹配日志格式,同时实现字段的添加、删除及转换等操作。
input {

    file {
        path => "/data/logs/nginx_logs/access.log"
        type => "dev-chuiyi-site-landing-1"
#        codec => json
        start_position => "end"
    }
}


filter {

    grok {
        patterns_dir => "/usr/local/logstash-6.3.2/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns"     # 定义logtash中自定义模式目录所在的位置
        match => {
            "message" => "%{NGINX_LOGS}"
        }
        #match => [
        #    "message","%{NGINX_LOGS}",
        #    "message","%{USERHOST:userhost} %{USERNAME:username}"
        #]

        add_field => {                      # 新增name_%{remote_addr}_[0|1]字段
            "name_%{type}_0" => "hello world 0"
            "name_%{type}_1" => "hello world 1"
            "name_%{type}_2" => "hello world 2"
            "coerce_value" => "null"
        }

        remove_field => ["message"]         # 删除message字段
        remove_field => ["name_%{type}_0"]
    }

    if [request] == "HEAD / HTTP/1.0" {     # 判断request字段是否匹配,如果匹配则drop进行丢弃该条信息,不传输至es
        drop {}
    }

    geoip {
        source => "remote_addr"
        database => "/usr/local/src/GeoLite2-City_20180807/GeoLite2-City.mmdb"
        fields => ["country_name","region_code", "city_name", "ip"]
    }

    mutate {
        copy => {                           # 将原有的字段进行拷贝一份并命名
            "remote_addr" => "client_addr"
        }
        convert => {                        # 将原有的字段的值进行类型转换,可转换的类型为: integer/float/string/boolean
            "status" => "integer"
            "request_time" => "float"
        }
        split => {                          # 将原有字段的string进行split以指定的符号(分隔符)进行分隔,分隔后变为一组数组
            "remote_addr" => "."
        }
        join => {                           # 将原有字段的array进行join以指定的的符号(分隔符)进行合并,合并后变为一串字符串
            "remote_addr" => "-"
        }
        update => {                         # 用于替换原有字段的值,如果原有字段不存在,则不执行任何操作,原有字段不支持使用%{}变量,但值可以调用%{}变量
            "upstream_response_time" => "%{remote_addr}"
        }
        replace => {                        # 用于替换原有字段的值,如果原有字段不存在,则新增一个字段,新增的字段不支持使用%{}变量,但值可以调用%{}变量
            "new_replace" => "%{remote_addr}"
        }
        gsub => [                           # 用于替换原有字段的值,第一个元素为字段名,第二个为正则或匹配的字符串,第三个为要替换的值(只支持字符串替换操作)
            "time_local", "\d{2}/[A-Za-z]{3}/[\d:]+", "this is time",
            "request", "HTTP", "http"
        ]
        rename => {                         # 将字段http_referer重命名为http_source
            "http_referer" => "http_source"
        }
    }

}

output {
    redis {
        host => "10.168.216.1"
        port => "6379"
        key => "redis_auth"
        data_type => "list"
        password => "2RMYFdlZNSSsqKYi"
    }
}

关于grok nginx正则
cat /usr/local/logstash-6.3.2/vendor/bundle/jruby/2.3.0/gems/logstash-patterns-core-4.1.2/patterns

REMOTE_ADDR              ^([\d\.]+)
TIME_LOCAL               [^\s]+\s\+\d{4}
REQUEST                  [A-Z]+\s.*\sHTTP/\d\.\d
STATUS                   \d{3}
BODY_BYTES_SENT          \d+
HTTP_REFERER             [^\|]*
HTTP_USER_AGENT          [^\|]*
HTTP_X_FORWARDED_FOR     [\d.]+|-
UPSTREAM_ADDR            [^\|]*
UPSTREAM_STATUS          [\d]{3}|-
REQUEST_TIME             [0-9]*\.[0-9]+
UPSTREAM_RESPONSE_TIME   ([0-9]*\.[0-9]+|-)$

NGINX_LOGS %{REMOTE_ADDR:remote_addr}\|%{TIME_LOCAL:time_local}\|%{REQUEST:request}\|%{STATUS:status}\|%{BODY_BYTES_SENT:body_bytes_sent}\|%{HTTP_REFERER:http_referer}\|%{HTTP_USER_AGENT:http_user_agent}\|%{HTTP_X_FORWARDED_FOR:http_x_forwarded_for}\|%{UPSTREAM_ADDR:upstream_addr}\|%{UPSTREAM_STATUS:upstream_status}\|%{REQUEST_TIME:request_time}\|%{UPSTREAM_RESPONSE_TIME:upstream_response_time}

USERHOST [\d\.]+
USERNAME [a-zA-Z]+

关于nginx日志格式

log_format  main    '$remote_addr|$time_local|$request|'
                    '$status|$body_bytes_sent|$http_referer|'
                    '$http_user_agent|$http_x_forwarded_for|'
                    '$upstream_addr|$upstream_status|$request_time|$upstream_response_time';
### 在 Logstash 中使用正则表达式匹配日志的方法 Logstash 提供了强大的过滤功能,其中 `grok` 是最常用的过滤器之一,用于将非结构化数据解析为结构化和可查询的数据。通过 `grok`,可以编写正则表达式来提取日志中的关键信息[^2]。 #### Grok 过滤器的基本用法 Grok 过滤器允许用户定义正则表达式模式,并将其应用于日志消息以提取特定字段。以下是一个基本示例,展示如何使用 Grok 解析日志: ```plaintext filter { grok { match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{LOGLEVEL:log_level} %{GREEDYDATA:log_message}" } } } ``` 上述代码中,`%{TIMESTAMP_ISO8601}` 和 `%{LOGLEVEL}` 是预定义的 Grok 模式,分别用于匹配时间戳和日志级别[^1]。`%{GREEDYDATA}` 用于捕获剩余的日志内容。 #### 自定义正则表达式 如果预定义的模式无法满足需求,可以编写自定义正则表达式。例如,假设日志格式如下: ``` 2023-10-01 12:34:56 INFO UserLogin username=john action=login status=success ``` 可以通过以下方式提取日志中的各个部分: ```plaintext filter { grok { match => { "message" => "%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME} %{LOGLEVEL:log_level} %{WORD:event_name} username=%{WORD:username} action=%{WORD:action} status=%{WORD:status}" } } } ``` 此正则表达式将提取日志中的时间、日志级别、事件名称、用户名、操作类型以及状态等字段[^3]。 #### 条件判断与正则匹配 除了简单的日志解析外,还可以结合条件语句对日志进行进一步处理。例如,仅当日志级别为 `ERROR` 时才提取相关字段: ```plaintext filter { if [message] =~ /ERROR/ { grok { match => { "message" => "%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME} ERROR %{GREEDYDATA:error_message}" } } } } ``` 上述代码中,`if [message] =~ /ERROR/` 表示仅当消息包含 `ERROR` 时,才会执行后续的 Grok 解析操作[^4]。 #### 常见正则表达式模式 以下是几个常见的正则表达式模式及其用途: - 匹配以特定字符串结尾:`[field_name] =~ /abc$/`。 - 匹配以特定字符串开头:`[field_name] =~ /^abc/`。 - 匹配数字或字母:`[field_name] =~ /[0-9a-z]/`。 - 匹配非数字字符:`[field_name] =~ /[^0-9]/`。 #### 示例:完整配置文件 以下是一个完整的 Logstash 配置文件示例,展示如何使用 Grok 和正则表达式解析日志: ```plaintext input { file { path => "/var/log/example.log" start_position => "beginning" } } filter { grok { match => { "message" => "%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME} %{LOGLEVEL:log_level} %{GREEDYDATA:log_message}" } } if [log_level] == "ERROR" { mutate { add_field => { "error_flag" => "true" } } } } output { elasticsearch { hosts => ["http://localhost:9200"] index => "example_index" } } ``` 此配置文件从指定路径读取日志文件,使用 Grok 提取日志中的时间、日志级别和消息内容,并在日志级别为 `ERROR` 时添加一个自定义字段 `error_flag`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值