如何使用Grok提取Logstash含AM/PM的mm/dd格式日期时间并转24小时制
解决方案
1. 修正后的Grok匹配规则
你之前使用的%{TIME}默认仅捕获时分秒部分,不会包含后续的AM/PM标识,需要自定义捕获组提取完整的日期时间串:
^\[event\] (?<raw_datetime>%{MONTHNUM}/%{MONTHDAY} %{TIME} [AP]M) %{GREEDYDATA:description}
2. 完整Logstash Filter配置
搭配date过滤器实现自动转24小时制、固定年份为2020:
filter { # 第一步:Grok提取字段 grok { match => { "message" => "^\[event\] (?<raw_datetime>%{MONTHNUM}/%{MONTHDAY} %{TIME} [AP]M) %{GREEDYDATA:description}" } } # 第二步:补全固定年份2020 mutate { add_field => { "raw_datetime" => "2020 %{raw_datetime}" } } # 第三步:解析时间并自动转24小时制 date { match => [ "raw_datetime", "yyyy MM/dd hh:mm:ss.S a" ] timezone => "Asia/Shanghai" # 替换为你日志实际对应的时区 target => "log_timestamp" # 可修改为你想要存储的字段名,填@timestamp则覆盖默认时间字段 } # 可选:清理不需要的临时字段 mutate { remove_field => [ "raw_datetime", "message" ] } }
关键说明
- 时间格式中的
a是Java SimpleDateFormat的标识符,专门用于匹配AM/PM标识,搭配12小时制的hh小时标识,解析时会自动转换为24小时制的时间对象 - 固定2020年的逻辑通过手动拼接年份前缀实现,避免date过滤器默认使用当前年份
timezone参数需要和日志生成的时区对齐,否则会出现时间偏移
内容的提问来源于stack exchange,提问作者Kamikaze K
相关产品推荐
相关产品推荐

