V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
watara
V2EX  ›  Logstash

请教下这种情况下如何 logstash 处理时间问题?

  •  
  •   watara · 112 天前 · 219 次点击
    这是一个创建于 112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:

    因为项目更新,打算弃用原来的日志流架构,换用 logstash 处理日志。为了保持后续流程不动,所以需要 logstash 的输出要保持于之前架构的格式一致。

    问题:

    日志流需要处理的是 nginx 的日志,日志体中已经有一个时间字段(在这里记作 ST1 吧,原始格式是"23/Jul/2021:14:25:29 +0800"),然后输出的内容中会涉及到时间的字段,格式以及来源分别如下:

    字段 1:"2021/7/23 14:25",记录 logstash 处理的时间

    字段 2:"20210723",根据 nginx 原始日志时间 ST1 转换出的日期

    字段 3:"2021/7/23 14:25",根据 nginx 原始日志时间 ST1 转换出的时间

    字段 4:"23/Jul/2021:14:25:29 +0800",原始的 nginx 原始日志时间 ST1

    我现在能正确填充字段 4,其他 3 个字段(特别是字段 2 )没有思路,请教有大佬能指点一二么?

    5 条回复    2021-08-14 15:29:03 +08:00
    calmzhu
        1
    calmzhu   112 天前   ❤️ 1
    https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

    If your time field has multiple possible formats, you can do this:

    match => [ "logdate", "MMM dd yyyy HH:mm:ss",
    "MMM d yyyy HH:mm:ss", "ISO8601" ]
    watara
        2
    watara   112 天前
    @calmzhu #1 感谢大佬,我再去仔细研究下这篇文章
    watara
        3
    watara   111 天前
    @calmzhu #1 我仔细研究了下这篇文章,好像并不符合我的需求。我用 ruby 模块搞定我的需求了。

    ```
    filter {
    ruby {
    code => 'event.set("[curr_date]", Time.at(Time.now.to_i - 86400).localtime("+05:30").strftime("%Y-%m-%d %H:%M:%S"))'
    }
    }
    ```
    calmzhu
        4
    calmzhu   107 天前   ❤️ 1
    @watara
    logstash 默认有 @timestamp 字段表示处理时间。
    date 可以解析 nginx 日志时间。

    格式转换的话,看你之前架构支持格式了,必须转文本的话 grok 或者直接写 ruby 都很省事。
    watara
        5
    watara   107 天前
    @calmzhu #4 恩呢,后来搞定了呢,用的 Ruby,发现只是这种简单小功能,还是很方便的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1693 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 17:00 · PVG 01:00 · LAX 09:00 · JFK 12:00
    ♥ Do have faith in what you're doing.