用于自定义日志的logstash grok筛选器

用于自定义日志的logstash grok筛选器,logstash,logstash-grok,elastic-stack,Logstash,Logstash Grok,Elastic Stack,我有两个相关的问题。第一个是如何最好地搜索具有“凌乱”间距的日志,等等,第二个是如何处理具有任意属性-值对的日志,我将分别询问。(见:) 所以对于第一个问题,我有一个日志行,看起来像这样: 14:46:16.603 [http-nio-8080-exec-4] INFO METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1

我有两个相关的问题。第一个是如何最好地搜索具有“凌乱”间距的日志,等等,第二个是如何处理具有任意属性-值对的日志,我将分别询问。(见:)

所以对于第一个问题,我有一个日志行,看起来像这样:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92
通过使用,我最终得出了以下适用于该系列的grok模式:

%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}
使用以下配置文件:

input {
        file {
                path => "/home/robyn/testlogs/trimmed_logs.txt"
                start_position => beginning
                sincedb_path => "/dev/null" # for testing; allows reparsing
        }
}
filter {
        grok {
                match => {"message" => "%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}" }
        }
}
output {
        file {
                path => "/home/robyn/filteredlogs/trimmed_logs.out.txt"
        }
}
我得到以下输出:

{"message":"14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92","@version":"1","@timestamp":"2015-08-07 T17:55:16.529Z","host":"hlt-dev","path":"/home/robyn/testlogs/trimmed_logs.txt","timestamp":"14:46:16.603","http":"[http-nio-8080-exec-4]","loglevel":"INFO","logtype":"METERING","msg":"93e6dd5e-c009-46b3-b9eb-f753ee3b889a","action":"CREATE_JOB","job":"a820018e-7ad7-481a-97b0-bd705c3280ad","data":"71b1652e-16c8-4b33-9a57-f5fcb3d5de92"}
这正是我想要的,但我觉得这是一个非常笨拙的模式,特别是需要大量使用%{SPACE}和%{NOSPACE}。这对我来说意味着我并没有真正做到最好。我应该为十六进制ID创建更具体的模式吗?我想我需要loglevel和logtype之间的%{SPACE},因为日志中的INFO和METERING之间有额外的空间,但这也让人觉得很麻烦

另外,我如何获取日志的时间戳来替换@timestamp,它似乎是logstash接收日志的时间戳,我们不希望/不需要它


很明显,我刚刚开始学习ELK和grok,因此也非常感谢指向有用资源的指针。

您可以使用一个现有模式来代替
NOTSPACE
,它是
UUID
。另外,当只有一个空格时,不需要使用
空格
模式,您可以省略它。我还使用了
USERNAME
模式(可能名称错误),只是为了捕获
http
字段

所以它是这样的,您只有一个
空间
模式来捕获多个空间

示例日志行:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92
格罗克模式:

%{TIME:timestamp} \[%{USERNAME:http}\] %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{UUID:msg} %{WORD:action} job=%{UUID:job} data=%{UUID:data}
格罗克会说出这句话:

{
  "timestamp": [
    [
      "14:46:16.603"
    ]
  ],
  "HOUR": [
    [
      "14"
    ]
  ],
  "MINUTE": [
    [
      "46"
    ]
  ],
  "SECOND": [
    [
      "16.603"
    ]
  ],
  "http": [
    [
      "http-nio-8080-exec-4"
    ]
  ],
  "loglevel": [
    [
      "INFO"
    ]
  ],
  "SPACE": [
    [
      "  "
    ]
  ],
  "logtype": [
    [
      "METERING"
    ]
  ],
  "msg": [
    [
      "93e6dd5e-c009-46b3-b9eb-f753ee3b889a"
    ]
  ],
  "action": [
    [
      "CREATE_JOB"
    ]
  ],
  "job": [
    [
      "a820018e-7ad7-481a-97b0-bd705c3280ad"
    ]
  ],
  "data": [
    [
      "71b1652e-16c8-4b33-9a57-f5fcb3d5de92"
    ]
  ]
}

也可以使用\s*代替空格模式

要删除字段,您可以使用mutate插件,有一个名为“remove\u field”的方法-->


如果删除此字段,则必须在kibana中添加新索引。因为kibana使用@timestamp字段对事件进行排序,如果没有其他选项的话。

你能帮我为这个模式编写grok过滤器吗:[2016-10-28512:13:20388][INFO][o.e.p.PluginsService][hTYKFFt]加载的模块[ingest common]我也这样做过:{[%{TIME:timestamp}]]%{SPACE}%[%{WORD loglevel}]]]%{SPACE SPACE}%[%{WORD data:data}%{SPACE%{WORD:data}%{data:message}%[{WORD:message}]}你能帮我解决这个问题吗?@SoundaryaThiagarajan你应该用这个来创建一个新问题。