场景
ELK版本: 8.2.2
列出索引
GET _cat/indices
获取当前生命周期策略
GET _ilm/policy
写入一条数据到logs-login-test数据流中
POST /logs-login-test/_doc/
{
"@timestamp": 1663567005424,
"username": "Jack",
"title": "ops",
"level": "info",
"log_type": "access_log",
"logger": "http.log.access.access_logger",
"start_time": 1663567005
}
日志中时间戳转换为ISO日期, 并调整为Date字段类型
需求是把已有str类型的start_time字段转换为ISO日期类型另存为新字段start_time_timestamp,并且调整为date类型字段
一. 新增Ingest Pipelines
Kibana UI -> Stack Management -> Ingest Pipelines -> Create pipeline -> New Pipeline -> Import Processor
{
"processors": [
{
"date": {
"field": "start_time",
"formats": [
"UNIX"
],
"target_field": "start_time_timestamp"
}
}
]
}
二. 对已存日志执行Pipelines
POST logs-login-test/_update_by_query?pipeline=logs-login-test&wait_for_completion=false
{
"query": {
"match_all": {}
}
}
可以看到已经添加上了新的字段”start_time_timestamp”, 但是还是keyword类型
三. 转换字段类型为data
上面转换后的”start_time_timestamp”字段类型还是text,需要转换为时间类型后才可以在Dashboard等地方使用字段作为日期轴, 这就要说到es的template, 我们创建的索引是logs-login-test, 其实是符合es自带的”logs”模板的匹配, 这个模板并没有对任何字段进行mapping设置.
参考Change mappings and settings for a data stream
知道了数据流字段类型是通过模板设置的, 那么修改字段类型就的思路就可以是:
- 新增模板logs-login-test,优先级高于自带的”logs”, mapping设置”start_time_timestamp”字段类型为”date_nanos”
PUT _index_template/logs-login
{
"version": 2,
"priority": 101,
"template": {
"mappings": {
"properties": {
"start_time_timestamp": {
"index": true,
"ignore_malformed": false,
"store": false,
"type": "date_nanos",
"doc_values": true
}
}
}
},
"index_patterns": [
"logs-login-*",
"logs-login-test"
],
"data_stream": {
"hidden": false,
"allow_custom_routing": false
},
"composed_of": [
"logs-mappings",
"data-streams-mappings",
"logs-settings"
],
"_meta": {
"managed": true,
"description": "default logs template installed by x-pack"
}
}
- 新增符合自建template匹配规则的数据流
PUT /_data_stream/logs-login-new
- 获取当前数据流中的索引
GET /_resolve/index/logs-login-test
- 执行reindex,复制老数据流中数据到新的数据流中
POST /_reindex?wait_for_completion=true
{
"source": {
"index": "logs-login-test"
},
"dest": {
"index": "logs-login-new",
"op_type": "create"
}
}
这个时候可以看到已经有两条一模一样的数据在两个数据流中,但是新的数据流中”start_time_timestamp”字段已经是”date_nanos”日期格式了.
?wait_for_completion=true参数异步执行,会返回一个taskid, 可以通过以下获取任务进度,数据量非常庞大的时候可以用
GET _tasks/{taskid}
GET logs-login-new/_mapping
Data view中看到”start_time_timestamp”字段感叹号,是因为旧的数据流中字段类型冲突
- 删除旧的数据流
DELETE /_data_stream/logs-login-test
可以看到字段已经改为时间类型了
- 测试新数据写入, 还是用logs-login-test数据流,这次应该会使用我们自定义的template ,默认mapping了字段的.
POST /logs-login-test/_doc/
{
"@timestamp": 1663581020000,
"username": "Jack",
"title": "ops",
"level": "info",
"log_type": "access_log",
"logger": "http.log.access.access_logger",
"start_time": 1663581020,
"start_time_timestamp": "2022-09-19T09:50:20.000Z"
}
- 这个时候去kibana创建图表,可以看到日期已经可以选择我们的自定义字段”start_time_timestamp”了
other
转载请注明来源, 欢迎对文章中的引用来源进行考证, 欢迎指出任何有错误或不够清晰的表达, 可以邮件至 chinaops666@gmail.com