Logstash 如何用 date 过滤器把日志时间解析为 @timestamp?
Logstash 的 date 过滤器把日志里的时间字符串解析为事件时间戳 @timestamp:match 指定字段与格式(如 dd/MMM/yyyy:HH:mm:ss Z)。本文给出配置示例、常见格式速查与时区注意事项。
用 date 过滤器:指定日志中时间字段的位置与格式,解析成功后会替换事件的 @timestamp——ES 里的时间序列就按日志真实时间排序,而不是按采集时间。
基本配置
filter {
grok {
match => { "message" => "%{HTTPDATE:log_time}" } # 先提取时间字符串
}
date {
match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"] # 再解析为时间戳
}
}
Nginx 时间 10/Oct/2000:13:55:36 +0000 对应格式 dd/MMM/yyyy:HH:mm:ss Z。
常见格式速查
| 日志时间样例 | match 格式 |
|---|---|
2024-01-15 10:30:00 |
yyyy-MM-dd HH:mm:ss |
2024-01-15T10:30:00.123Z |
ISO8601(内置别名) |
15/Jan/2024:10:30:00 +0800 |
dd/MMM/yyyy:HH:mm:ss Z |
1705314600(Unix 秒) |
UNIX |
1705314600123(毫秒) |
UNIX_MS |
支持写多个格式按序尝试:match => ["ts", "ISO8601", "yyyy-MM-dd HH:mm:ss"]。
时区注意
格式里没有时区信息时,用 timezone => "Asia/Shanghai" 显式指定——否则按 UTC 解析,时间会差 8 小时。
观测云对照
观测云 DataKit Pipeline 的时间字段处理同样支持自定义格式解析,time 字段会作为日志的标准时间在查看器中使用;多格式兼容与默认值处理都有内置函数。
常见问题(FAQ)
Q:解析失败会怎样? 事件带上 _dateparsefailure 标签继续流转,@timestamp 保留采集时间——可以在 Kibana 筛这个标签找问题日志。
Q:为什么要用日志时间而不是采集时间? 网络延迟/重试会让采集时间偏离真实发生时间,排障与统计都会错位。