elk稍微复杂的日志解析

elk日志解析,稍微复杂一些的日志
此日志中的json里字段非固定,6-20个不等,格式一致,日志模板如下

[2020-09-21 19:50:30.132] --- Recv data from SocketId=360559 Socket=82
POST /var/v2/slv/cuy_send HTTP/1.1
Connection: keep-alive
X-Real-IP: 0.0.0.0
X-Forwarded-For: 0.0.0.0
Host: 0.0.0.0
Content-Length: 109
Content-Type: application/json; charset=UTF-8
Content-Encoding: utf-8
User-Agent: Apache-HttpClient/4.5.8 (Java/1.7.0_79)
Accept-Encoding: gzip,deflate

{"abc":"X09","pdd":"123456","me":"12345678901","cnt":"%8825%D5%CB%BBD4%AA.%D3%E0%B6%EE%5B424.47%5D.%D4%AA","par":"292000","md":0,"rg":0}

使用的解析规则如下

grok 
     {
      match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp_log}\] --- Recv data from SocketId=%{NUMBER:socket_id} Socket=%{NUMBER:socket}\n%{WORD:http_method} %{DATA:http_request} %{GREEDYDATA:http_version}\nConnection: %{GREEDYDATA:Connection}\nX-Real-IP: %{GREEDYDATA:X-Real-IP}\nX-Forwarded-For: %{GREEDYDATA:X-Forwarded-For}\nHost: %{GREEDYDATA:Host}\nContent-Length: %{GREEDYDATA:Content-Length}\nContent-Type: %{GREEDYDATA:Content-Type}\nContent-Encoding: %{GREEDYDATA:Content-Encoding}\nUser-Agent: %{GREEDYDATA:User-Agent}\nAccept-Encoding: %{GREEDYDATA:Accept-Encoding}\n\s*\n%{GREEDYDATA:http_body}"}
      }
      json {
      source => "http_body"
      }
      remove_field => ["socket_id","Connection","User-Agent","http_version","Host","Accept-Encoding","http_method","Content-Encoding","X-Forwarded-For","http_request","socket","Content-Length","X-Real-IP","Content-Type"]

解析规则可实现一层的解析,也可删除不要的字段,json解析未生效

需求:需要保留时间戳和json中的内容(内容需解析)

基于Monster 组和GPT的调写:

  • 根据提供的日志模板和解析规则,可以通过以下步骤来解析 elk 日志:
  • 使用 grok 模式匹配,从消息中提取时间戳和 JSON 字符串。已经提供了 grok 规则,可以直接使用。
  • 使用 JSON 解析器将 JSON 字符串转换为 JSON 对象。在提供的解析规则中,JSON 解析器被包含在 Logstash 管道的最后一步。但是,由于在该规则中使用了 remove_field 指令,所以 JSON 对象已经被删除。要将 remove_field 从解析规则中移除,以保留 JSON 对象。最终的解析规则应如下所示:
grok {
  match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp_log}\] --- Recv data from SocketId=%{NUMBER:socket_id} Socket=%{NUMBER:socket}\n%{WORD:http_method} %{DATA:http_request} %{GREEDYDATA:http_version}\nConnection: %{GREEDYDATA:Connection}\nX-Real-IP: %{GREEDYDATA:X-Real-IP}\nX-Forwarded-For: %{GREEDYDATA:X-Forwarded-For}\nHost: %{GREEDYDATA:Host}\nContent-Length: %{GREEDYDATA:Content-Length}\nContent-Type: %{GREEDYDATA:Content-Type}\nContent-Encoding: %{GREEDYDATA:Content-Encoding}\nUser-Agent: %{GREEDYDATA:User-Agent}\nAccept-Encoding: %{GREEDYDATA:Accept-Encoding}\n\s*\n%{GREEDYDATA:http_body}"}
}
json {
  source => "http_body"
}



  • 这个新规则将通过 grok 模式匹配来提取时间戳和 JSON 字符串。然后,将使用 Logstash 中提供的 JSON 解析器来将 JSON 字符串转换为 JSON 对象。
  • 在 Logstash 7.0 版本及更高版本中,推荐使用 json 插件而不是 json 过滤器。所以,用以下规则替换上述规则中的 json 过滤器:
json {
  source => "http_body"
  remove_field => ["socket_id","Connection","User-Agent","http_version","Host","Accept-Encoding","http_method","Content-Encoding","X-Forwarded-For","http_request","socket","Content-Length","X-Real-IP","Content-Type"]
}


  • 这个新规则将包括在 json 插件中,并且在转换 JSON 之后删除不必要的字段。

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下。
根据提供的日志模板,可以使用以下的ELK解析规则来实现保留时间戳和JSON中的内容(内容需解析):

filter {
  grok {
    match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp_log}\] --- Recv data from SocketId=%{NUMBER:socket_id} Socket=%{NUMBER:socket}\n%{WORD:http_method} %{DATA:http_request} %{GREEDYDATA:http_version}\nConnection: %{GREEDYDATA:Connection}\nX-Real-IP: %{GREEDYDATA:X-Real-IP}\nX-Forwarded-For: %{GREEDYDATA:X-Forwarded-For}\nHost: %{GREEDYDATA:Host}\nContent-Length: %{GREEDYDATA:Content-Length}\nContent-Type: %{GREEDYDATA:Content-Type}\nContent-Encoding: %{GREEDYDATA:Content-Encoding}\nUser-Agent: %{GREEDYDATA:User-Agent}\nAccept-Encoding: %{GREEDYDATA:Accept-Encoding}\n\s*\n%{GREEDYDATA:http_body}" }
  }
  json {
    source => "http_body"
    remove_field => ["socket_id","Connection","User-Agent","http_version","Host","Accept-Encoding","http_method","Content-Encoding","X-Forwarded-For","http_request","socket","Content-Length","X-Real-IP","Content-Type"]
  }
}

以上解析规则中,使用了Grok模式匹配来提取时间戳和JSON中的内容。使用JSON过滤器来解析JSON中的字段,并删除不需要的字段。这些过滤器都在Logstash的filter部分中定义。最后,通过在Logstash的output部分中定义输出目标,将解析后的日志数据发送到目标位置。

你可以将以上配置文件保存为logstash.conf文件,然后使用Logstash启动该配置文件。例如,可以使用以下命令启动Logstash:

bin/logstash -f logstash.conf

启动成功后,Logstash将会开始解析并处理日志数据。处理后的数据将会被发送到指定的输出目标。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢