【Graylog】索引模板mapping自定义


前言

Graylog使用中,总会有千奇百怪的要求,比如有同事就想全盘挪移ELK那套东西到Graylog,目前迁移一个业务日志到平台中,要求使用Logstash输入到Elasticsearch,Graylog管控索引声明周期,负责查询功能。


一、Logstash输入到Elasticsearch

这一步很好实现,但是如果想要在Graylog中可以查看到,需要下一番功夫,我遇到的问题有以下两点。

  1. 时间戳问题,@timestamp转换为timestamp,还要对时间进行矫正,要不然会有八个小时的时差
  2. 补全字段,如果想要在Graylog可以搜索到,需要补全字段。

二、进入主题

1.根据拿到的template.json分析

  通过查看json文件,发现大部分都是keyword类型,所以根据可以不用加入到json中,最特殊的是其中一个使用ik分词器的(安装分词器,分词器的安装比较烂大街,就不在赘述了)所以使用Graylog默认的mapping肯定是行不通的。

        查看官方文档,很容易就找到了创建外挂mapping,我的理解是,新建索引集后,会根据默认的mapping+外挂的mapping共同生成一个索引mapping,参考文档:Graylog文档

2.新建文件

        新建一个json文件,新增字段的mapping。

{
  "template": "cce_*",
  "mappings": {
    "message": {
      "properties": {
        "cluster_name": {
          "type": "keyword"
        },
        "log_level": {
          "type": "keyword"
        },
        "type": {
          "type": "keyword"
        },
        "log_time": {
          "type": "keyword"
        },
        "namespace_name": {
          "type": "keyword"
        },
        "pod_name": {
          "type": "keyword"
        },
        "log_type": {
          "type": "keyword"
        },
        "cluster_uuid": {
          "type": "keyword"
        },
        "container_name": {
          "type": "keyword"
        },
        "log_data": {
          "search_analyzer": "ik_smart",
          "analyzer": "ik_max_word",
          "type": "text",
          "fields": {
            "keyword": {
              "ignore_above": 256,
              "type": "keyword"
            }
          }
        },
        "workload_name": {
          "type": "keyword"
        },
        "collect_time": {
          "type": "date"
        }
      }
    }
  }
}

3.插入

curl -X PUT -d @'graylog-custom-mapping-7x.json' -H 'Content-Type: application/json' 'http://localhost:9200/_template/graylog-custom-mapping?pretty'

返回true即可。

4.验证

轮换索引集,查看mapping,成功。

{ - 
  "cce_2": { - 
    "mappings": { - 
      "message": { - 
        "dynamic_templates": [ - 
          { - 
            "internal_fields": { - 
              "match": "gl2_*",
              "match_mapping_type": "string",
              "mapping": { - 
                "type": "keyword"
              }
            }
          },
          { - 
            "store_generic": { - 
              "match_mapping_type": "string",
              "mapping": { - 
                "type": "keyword"
              }
            }
          }
        ],
        "properties": { - 
          "_time": { - 
            "type": "date"
          },
          "cluster_name": { - 
            "type": "keyword"
          },
          "cluster_uuid": { - 
            "type": "keyword"
          },
          "collect_time": { - 
            "type": "date"
          },
          "container_name": { - 
            "type": "keyword"
          },
          "full_message": { - 
            "type": "text",
            "analyzer": "ik_max_word"
          },
          "gl2_message_id": { - 
            "type": "keyword"
          },
          "gl2_processing_timestamp": { - 
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "gl2_receive_timestamp": { - 
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "gl2_remote_ip": { - 
            "type": "keyword"
          },
          "gl2_remote_port": { - 
            "type": "long"
          },
          "gl2_source_input": { - 
            "type": "keyword"
          },
          "gl2_source_node": { - 
            "type": "keyword"
          },
          "log_data": { - 
            "type": "text",
            "fields": { - 
              "keyword": { - 
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_smart"
          },
          "log_level": { - 
            "type": "keyword"
          },
          "log_time": { - 
            "type": "keyword"
          },
          "log_type": { - 
            "type": "keyword"
          },
          "message": { - 
            "type": "text",
            "analyzer": "ik_max_word"
          },
          "namespace_name": { - 
            "type": "keyword"
          },
          "pod_name": { - 
            "type": "keyword"
          },
          "source": { - 
            "type": "text",
            "analyzer": "analyzer_keyword",
            "fielddata": true
          },
          "source_type": { - 
            "type": "keyword"
          },
          "streams": { - 
            "type": "keyword"
          },
          "time_day": { - 
            "type": "date"
          },
          "time_hours": { - 
            "type": "keyword"
          },
          "time_min": { - 
            "type": "keyword"
          },
          "time_min_zero": { - 
            "type": "keyword"
          },
          "time_month": { - 
            "type": "date"
          },
          "time_nano": { - 
            "type": "long"
          },
          "time_sec": { - 
            "type": "keyword"
          },
          "timestamp": { - 
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss.SSS"
          },
          "type": { - 
            "type": "keyword"
          },
          "workload_name": { - 
            "type": "keyword"
          }
        }
      }
    }
  }
}

5. 遇到的错误

  • 注意json文件格式
  • 由于我使用版本,搭配的es为6,所以类型上一定不要错。

总结

熟能生巧,多看官方文档,特别是国外产品。

在Go语言中,使用Elasticsearch(ES)库,如`github.com/elastic/go-elasticsearch/v7`,可以方便地操作ES。如果你想要创建索引并指定自定义映射(Mapping),你可以按照以下步骤操作: 首先,确保安装了所需的包: ```bash go get github.com/elastic/go-elasticsearch/v7 go get github.com/elastic/go-elasticsearch/v7/esapi ``` 然后,你可以创建一个索引,并指定映射(Mapping)结构体,例如: ```go package main import ( "context" "encoding/json" "log" "github.com/elastic/go-elasticsearch/v7" "github.com/elastic/go-elasticsearch/v7/esapi" ) type CustomMapping struct { // 定义你的自定义字段及其数据类型 Field1 *string `json:"field1"` Field2 int `json:"field2"` } func createIndex(client *elasticsearch.Client, indexName string, mappingCustom Mapping) error { body, err := json.Marshal(mappingCustom) if err != nil { return err } indexRequest := esapi.IndexRequest{ Index: indexName, DocumentID: "_doc", Body: bytes.NewReader(body), } res, err := client.Do(context.Background(), indexRequest) if err != nil { return err } defer res.Body.Close() log.Printf("Response status: %s\n", res.Status) log.Printf("Response headers: %v\n", res.Header) return nil } func main() { // 创建Elasticsearch客户端 client, err := elasticsearch.NewClient( elasticsearch.SetURL("http://localhost:9200"), elasticsearch.SetBasicAuth("username", "password"), // 如果需要的话提供认证信息 ) if err != nil { log.Fatal(err) } // 索引名和自定义映射 indexName := "my_index" mappingCustom := CustomMapping{Field1: "example_value", Field2: 123} err = createIndex(client, indexName, mappingCustom) if err != nil { log.Fatal(err) } } ``` 在这个示例中,你需要将`"username"`和`"password"`替换为你实际的ES集群用户名和密码,以及`"http://localhost:9200"`替换为ES服务器地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值