首页 > 解决方案 > Logstash 变异过滤器 gsub 嵌套字段

问题描述

我正在尝试在将其发送到 ES 之前过滤 logstash 中的一些电子邮件。

我有一个字段仍然包含电子邮件地址,并且无法通过 mutate 过滤器对其进行 gsub。

mutate {
    gsub => [
        "log", "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", "--- FILTERED FROM LOGS ---",
        "message", "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", "--- FILTERED FROM LOGS ---"
            ]
        }

JSON:

{
  "_index": "logs-2021.03.09.11",
  "_type": "doc",
  "_id": "sdfsdf",
  "_version": 1,
  "_score": null,
  "_source": {
    "source": "stderr",
    "@timestamp": "2021-03-09T11:39:38.413Z",
    "kubernetes": {
      "namespace": "sdfsdk",
      "labels": {
        "pod-template-hash": "sdfsdf",
        "app": {
          "softwear": {
            "co/name": "sdfsd",
            "co/domain": "sdfsdf"
          }
        },
    "log": {
      "extra_fields": {
        "ctxt_response": "{\"records_id\":[{\"ext_id\":\"sdfsdf\",\"fcc_id\":sdfsdfsd,\"external_id\":\"sdfsdf\"}],\"success\":true}",
        "requestDevice": "\"\"",
        "ctxt_request": "{\"hash\":\"56kdfhsdfjshdkf\",\"change\":\"sdsd\",\"campaigns_id\":114,\"method\":\"sha1\",\"login\":\"test\",\"records\":[{\"emails\":[\"email-to-delete@gmail.com\"],\"external_id\":\"sdsdK\"}]}",
        "ctxt_response_code": "200"
      },

我怎样才能获得嵌套字段并 gsub 呢?[日志][额外字段][ctxt_request]

标签: regexfilterlogstashgsub

解决方案


尝试这个:

mutate {
    gsub => [
        "[log][extra_fields][ctxt_request]", "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", "--- FILTERED FROM LOGS ---",
        "message", "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}", "--- FILTERED FROM LOGS ---"
    ]
}

我还注意到您的正则表达式可能有所改进:

  • [A-Za-z0-9._%+-]
  • [A-Za-z0-9\._%+-](转义点.字符 - 您需要在 的两侧执行此操作@

您可能还想查看使用JSON 过滤器插件来解析该ctxt_request字段 - 然后您可以只覆盖该子字段的内容而不使用gsub

这是一个如何工作的示例。警告是 a) 它尚未经过测试,b)remove_fieldJSON输出执行操作可能不起作用(尽管如果JSON成功解析,删除源字段将起作用),以及 c) 您可能对如何使用其他想法构造字段。

json {
    source => "[log][extra_fields][ctxt_request]"
    target => "[log][extra_fields][parsed][ctxt_request]"
    remove_field => [
        "[log][extra_fields][ctxt_request]",
        # remove the field completely
        "[log][extra_fields][parsed][ctxt_request][records][emails]"
    ]
}
mutate {
    # or replace it with the text from your question
    replace => {
        "[log][extra_fields][parsed][ctxt_request][records][emails]" =>
        "--- FILTERED FROM LOGS ---"
    }
}

推荐阅读