app开发定制公司logstash config filter 配置(grok、date、ruby):日志拆分转换并展示在kibana中

概要:ELKapp开发定制公司部署成功后,需要kibanaapp开发定制公司图形展示某应用的性能。app开发定制公司初步通过统计分析日志的形式来模拟。日志中有sendTime :消息发出时间,recvTime:处理完毕后打印的日志时间。通过logstash 对日志进行拆分并计算recvTime和sendTime的差值即处理时间(本文标记为responseTime)。并将responseTime展示在kibana中

1、logstash 配置文件

logstash 的配置文件 input 是来自filebeat 端口5044 (filebeat 用于收集out.log的日志)

filter 是对日志内容进行匹配拆分和转换的操作。

logstash-beat.conf 配置文件内容

  1. input {
  2. beats {
  3. port => "5044"
  4. }
  5. }
  6. filter{
  7. grok{
  8. match => [
  9. "message" , "\<%{TIMESTAMP_ISO8601:recvTime}\> INFO recv :{\"ID\":\"%{NUMBER:recvID}\",.*\"sendTime\":\"%{TIMESTAMP_ISO8601:sendTime}\""
  10. ]
  11. }
  12. date {
  13. match => ["recvTime", "yyyy-MM-dd HH:mm:ss,SSS"]
  14. target => "recvTimeD"
  15. }
  16. date {
  17. match => ["sendTime", "yyyy-MM-dd HH:mm:ss,SSS"]
  18. target => "sendTimeD"
  19. }
  20. ruby {code => "event.set('responseTime', event.get('recvTimeD').to_i - event.get('sendTimeD').to_i)"}
  21. }
  22. output {
  23. stdout {
  24. }
  25. }
  26. #output {
  27. # elasticsearch {
  28. # hosts => ["http://localhost:9200"]
  29. # index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  30. # }
  31. #}

grok:是一种采用组合多个预定义的正则表达式,用来匹配分割文本并映射到关键字的工具。通常用来对日志数据进行预处理。logstash的filter模块中grok插件是其实现之一。

eg:日志格式

<2021-10-27 13:02:05,201> INFO :{"ID":"000007","Bond":"100001","BondName":"XN0001","sendTime":"2021-10-27 13:02:00,301"}

grok匹配 :

"message" , "\<%{TIMESTAMP_ISO8601:recvTime}\> INFO recv :{\"ID\":\"%{NUMBER:recvID}\",.*\"sendTime\":\"%{TIMESTAMP_ISO8601:sendTime}\""

(说明:message 是logstash 会把收到的日志内容存储在message字段中;

标红的部分是需要将一些值存储到属性中 比如:%{TIMESTAMP_ISO8601:recvTime} ,recvTime 会匹配到 2021-10-27 13:02:05,201;

可以用到正则表达式,日志中原有的< " 需要转义字符前面加\ 

Date:日期拆件

可以把存放在recvTime 和sendTime 中匹配到text 类型的日期转换为 date 类型

 date {
                match => ["recvTime", "yyyy-MM-dd HH:mm:ss,SSS"]
                target => "recvTimeD"
        }

以上配置 是将recvTime 中的值转换为 “yyyy-MM-dd HH:mm:ss,SSS”格式 并存储到target

 下面是通过kibana 查看到的字段 类型

:插件确实不错,可以随意实现日志解析,相比与正则和直接logstash中的json插件要方便灵活的多。 event.get 可以获取到logstash 中属性的值 event.set 是为属性赋值。 下面是分别获取recvTimeD和sendTimeD的值并转换成int类型 然后相减之后赋值给 responseTime。

ruby {code => "event.set('responseTime', event.get('recvTimeD').to_i - event.get('sendTimeD').to_i)"}

2、 现象验证:

启动logstash 标准输出 :

在out.log中输入日志信息:

  1. 日志:<2021-10-27 13:02:05,201> INFO recv :{"ID":"000007","Bond":"100001","BondName":"XN0001","sendTime":"2021-10-27 13:02:00,301"}
  2. 用命令的方式追加日志:
  3. printf "<2021-10-27 13:02:05,201> INFO recv :{\"ID\":\"000007\",\"Bond\":\"100001\",\"BondName\":\"XN0001\",\"sendTime\":\"2021-10-27 13:02:00,301\"}" >>out.log

logstash 输出:可以看到responseTime 得到的值是5

  1. {
  2. "responseTime" => 5,
  3. "@version" => "1",
  4. "sendTime" => "2021-10-27 13:02:00,301",
  5. "ecs" => {
  6. "version" => "1.11.0"
  7. },
  8. "recvID" => "000007",
  9. "message" => "<2021-10-27 13:02:05,201> INFO recv :{\"ID\":\"000007\",\"Bond\":\"100001\",\"BondName\":\"XN0001\",\"sendTime\":\"2021-10-27 13:02:00,301\"}",
  10. "tags" => [
  11. [0] "beats_input_codec_plain_applied"
  12. ],
  13. "@timestamp" => 2021-10-27T05:48:09.913Z,
  14. "log" => {
  15. "offset" => 1638,
  16. "file" => {
  17. "path" => "/home/chen/tool/log/out.log"
  18. }
  19. },
  20. "input" => {
  21. "type" => "log"
  22. },
  23. "host" => {
  24. "os" => {
  25. "version" => "7 (Core)",
  26. "platform" => "centos",
  27. "type" => "linux",
  28. "name" => "CentOS Linux",
  29. "codename" => "Core",
  30. "family" => "redhat",
  31. "kernel" => "3.10.0-1160.31.1.el7.x86_64"
  32. },
  33. "mac" => [
  34. [0] "52:54:00:aa:64:82"
  35. ],
  36. "architecture" => "x86_64",
  37. "ip" => [
  38. [0] "10.0.4.10",
  39. [1] "fe80::5054:ff:feaa:6482"
  40. ],
  41. "name" => "VM-4-10-centos",
  42. "hostname" => "VM-4-10-centos",
  43. "containerized" => false,
  44. "id" => "2eaabde29fb446cb8202d9ac64d99f37"
  45. },
  46. "recvTime" => "2021-10-27 13:02:05,201",
  47. "sendTimeD" => 2021-10-27T05:02:00.301Z,
  48. "agent" => {
  49. "version" => "7.15.0",
  50. "type" => "filebeat",
  51. "name" => "VM-4-10-centos",
  52. "hostname" => "VM-4-10-centos",
  53. "ephemeral_id" => "b3fd97d2-c8ce-45d2-8e52-6a609c366270",
  54. "id" => "1d86f210-382a-4889-8d0a-d99f642ae0e3"
  55. },
  56. "recvTimeD" => 2021-10-27T05:02:05.201Z
  57. }

重新停掉logstash 并修改配置 输出到es  启动logstash   在kibana查看现象如下图:

关于ELK的如何配置 的内容请参考:

 达到了我的目的 kibana 中可以实时展示 消息的响应时间。

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发