 Logstash截取日志解决超长日志不创建keyword问题
          Logstash截取日志解决超长日志不创建keyword问题
        
  # 问题描述
之前在搭建ELK日志收集系统时,使用Kinaba做了异常日志统计的看板。但是今天发现有些异常日志可以被搜索,但是在统计看板中没有统计到。
通过对比可被统计和不可被统计的日志字段,发现不可被统计的日志是因为没有创建keyword字段,通过检查索映射发现这个字段配置如下:
    "content": {
        "type": "text",
        "fields": {
        "keyword": {
            "type": "keyword",
            "ignore_above": 256
        }
        }
    }
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
可知是异常日志超长,导致keyword字段无法创建。
# 解决方案
异常日志因为打印堆栈信息,通常会很长。如果只是简单的修改ignore_above的值,则需要调为很大的值,在做聚合统计时肯定会影响性能。
所以一开始想试试在ElasticSearch中能否将content.keyword截取,但是查询后发现ElasticSearch不支持对keyword字段进行截取。
然后转而试试能否在Logstash处理日志时进行截取。
最终查到通过logstash的mutate插件的gsub功能截取日志。为了不丢失原始日志,可以将截取后的日志存入一个新的字段,如content_short:
filter {
    grok {
        match => { "message" => "%{DATA:timestamp} %{LOGLEVEL:loglevel} %{DATA:logger} %{DATA:class} \[%{DATA:traceId}\] \[%{DATA:biz}\] \[%{DATA:logFollower}\] %{GREEDYDATA:content}" }
    }
    mutate {
        add_field => { "content_short" => "%{content}" }
        gsub => [
            "content_short", "(.{255}).*", "\1"
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这段配置的含义如下:
- mutate:这是- Logstash的一个插件,用于对事件数据进行各种转换操作。
- gsub:这是- mutate插件的一个功能,用于对字段值进行正则表达式替换。
- "(?m)(.{256}).*":- (?m)是一个模式修饰符,使- .匹配任何字符,包括换行符。- (.{256}).*匹配前 256 个字符和之后的所有字符。
- "\1":这是替换字符串。- \1表示正则表达式中的第一个捕获组,即前 256 个字符。
这样就可以在Kibana中使用content_short字段进行聚合统计了。
编辑  (opens new window)
  上次更新: 2024/04/30, 08:49:24