m0_68170889 2023-05-05 16:24 采纳率: 30%
浏览 37
已结题

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中的内容(内容需解析)

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-05-05 16:37
    关注

    基于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 之后删除不必要的字段。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月13日
  • 已采纳回答 5月5日
  • 创建了问题 5月5日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见