本文转载自:【BigManing的博客】学习防丢
http://blog.youkuaiyun.com/qq_27818541/article/details/108063235
前言
项目有个需求:filebeat(v7.7)采集日志的时间替换为日志时间。通过调研,网上都是通过logstash来转换的,大概如下步骤(原理):
filter{
grok{
// 1 取出时间值 给 一个新字段
patterns_dir => "./patterns"
match => { "message" => ["%{IP:source_Ip},%{NUMBER:source_Port},%{IP:dest_Ip},%{NUMBER:dest_Port},%{MYPATTERN:create_Time}"]}
}
date {
// 2 只要时间字段匹配这个格式 就赋值给@timestamp。
match => [ "create_Time", "yyyy-MM-dd HH:mm:ss:ssssss" ]
target => "@timestamp"
}
}
解决办法:filebeat原生支持
在调研无望之际,全局阅览filebeat官网,终于在processor配置里找到了方法。主要是使用script 、timestamp 这两个属性。
script 作用是提取log里的时间值,并赋值给一个字段
timestamp作用是把一个字段值格式化为时间戳。这样采集时间戳就替换成了log里的时间。
例如 我的日志长这样
2020-08-05 16:21:51.824 [第10行 虚拟]
1
添加下面配置
processors:
...
- script:
lang: javascript
id: my_filter
tag: enable
source: >
function process(event) {
var str= event.Get("message");
var time =str.split(" ").slice(0,2).join(" ");
event.Put("start_time",time);
}
- timestamp:
# 格式化时间值 给 时间戳
field: start_time
# 使用我国东八区时间 解析log时间
timezone: Asia/Shanghai
layouts:
- '2006-01-02 15:04:05'
- '2006-01-02 15:04:05.999'
test:
- '2019-06-22 16:33:51'
输出结果为
{
"@timestamp": "2020-08-05T08:21:51.824Z",
"@metadata": {
"beat": "filebeat",
"type": "_doc",
"version": "7.7.0"
},
"message": "2020-08-05 16:21:51.824 [第10行 虚拟]",
"ecs": {
"version": "1.5.0"
}
}
附测试时完整配置:
filebeat.inputs:
- type: log
enabled: true
paths:
- /etc/test/1.log
reload.enabled: true
reload.period: 10s
# 这里直接打印出来(测试使用)
output.console:
pretty: true
processors:
- script:
lang: javascript
id: my_filter
tag: enable
source: >
function process(event) {
var str= event.Get("message");
var time =str.split(" ").slice(0,2).join(" ");
event.Put("start_time",time);
}
- timestamp:
field: start_time
timezone: Asia/Shanghai
layouts:
- '2006-01-02 15:04:05'
- '2006-01-02 15:04:05.999'
test:
- '2019-06-22 16:33:51'
注意事项
timezone大全
更多时区看这里
本文中timezone说明
很多朋友问到timezone的问题,我这里详细描述下。
@timestamp 这个字段 系统自带的,默认时间就是采集log的UTC时间 。例如 现在时间是2020-12-30 18:59:58.234 ,那么他的值为2020-12-30T10:59:58.234Z
现在我们手动替换@timestamp为日志时间(东八区),需要将时间字符串解析成UTC时间,赋值给@timestamp,那么我们必须显示的指定timezone 信息。
指定timezone后的表现
log时间字符串:2020-08-05 16:21:51.824
重新赋值的@timestamp值: 2020-08-05T08:17:11.535Z (正确)
未指定timezone后的表现
log时间字符串:2020-08-05 16:21:51.824
重新赋值的@timestamp值: 2020-08-05T16:17:11.535Z (默认使用了UTC零时区解析)