用regexp在fluentd中解析regex

a8jjtwal  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(945)

我们正在尝试解析在aks集群中运行的一些服务生成的日志。我们使用的efk堆栈版本为:
ElasticSearch: 7.4.2 ,弗伦特: 1.7.1 ,Kibana: 7.4.2 当我们在fluentd中使用下面的配置(json)时,我们能够在kibana Jmeter 板中看到日志-

<source>
  @type tail
  @id in_tail_container_logs
  path /var/log/containers/*nsp01_org-proj-*.log,/var/log/containers/*nsp02_org-proj-*.log,
  pos_file /var/log/fluentd-containers.log.pos
  enable_stat_watcher false
  tag kubernetes.*
  read_from_head true
  <parse>
    @type json
    time_format %Y-%m-%dT%H:%M:%S.%NZ
  </parse>
</source>

我们需要使用regex解析日志( regexp )创造了一个。
样品记录-

20-02-2020 08:31:42.931 [http-nio-8080-exec-1, abcd1234abcd, abcd1234abcd] INFO com.org.proj.az.controller.ModuleController.retrieveModulePortfolio - |||| PROJ-Module Microservice~retrieveModulePortfolio~GET~null~null~BusinessKeys[ProspectNumber:00000123456]~ Request Received for Portfolio with prospectNumber ||||

使用的regexp-

^(?<date>[^ ][^~][^abc]*)\s\[(?<threadcollection>[a-z\0-9;:,.]*)\]\s(?<log_level>\w+)\s(?<class_name>[^|]+)\|+\s(?<app_name>[^~]*)\~(?<app_operation>\w+)\~(?<http_operation>\w+)\~(?<transaction_id>[0-9a-z]+)\~(?<message_id>[0-9a-zA-Z]+)\~(?<business_keys>[^~]*)\~(?<log_message>[a-zA-Z\s:;,."']+)\|+

我们在fluentd中的配置 regexp 解析日志-

<source>
      @type tail
      @id in_tail_container_logs
      path /var/log/containers/*nsp01_org-proj-*.log,/var/log/containers/*nsp02_org-proj-*.log,
      pos_file /var/log/fluentd-containers.log.pos
      enable_stat_watcher false
      tag kubernetes.*
      read_from_head true
      <parse>
        @type regexp
        expression /^(?<date>[^ ][^~][^abc]*)\s\[(?<threadcollection>[a-z\0-9;:,.]*)\]\s(?<log_level>\w+)\s(?<class_name>[^|]+)\|+\s(?<app_name>[^~]*)\~(?<app_operation>\w+)\~(?<http_operation>\w+)\~(?<transaction_id>[0-9a-z]+)\~(?<message_id>[0-9a-zA-Z]+)\~(?<business_keys>[^~]*)\~(?<log_message>[a-zA-Z\s:;,."']+)\|+/
        time_format %Y-%m-%dT%H:%M:%S.%NZ
        time_key date
        keep_time_key true
      </parse>
    </source>

使用此方法时( regexp ),没有匹配的日志,kibana Jmeter 板为空。

s3fp2yjn

s3fp2yjn1#

根据文档,您应该只使用模式本身,而不使用regex分隔符。
此外,如果您计划匹配数字,则不应转义 0 在character类中,但必须有mean匹配方括号中的任何内容,因此需要 [^\]\[]* .
如果您不关心最后一个需要捕获的组之后是什么,请使用 .* ,无需使用 \|+ .
使用

@type regexp
expression ^(?<date>[^ ][^~][^abc]*)\s\[(?<threadcollection>[^\]\[]*)\]\s(?<log_level>\w+)\s(?<class_name>[^|]+)\|+\s(?<app_name>[^~]*)\~(?<app_operation>\w+)\~(?<http_operation>\w+)\~(?<transaction_id>[0-9a-z]+)\~(?<message_id>[0-9a-zA-Z]+)\~(?<business_keys>[^~]*)\~(?<log_message>[a-zA-Z\s:;,."']+).*

查看regex演示。

相关问题