【问题标题】:Syslog timestamp without year?没有年份的系统日志时间戳?
【发布时间】:2021-06-23 01:36:54
【问题描述】:

我正在将我的日志回填到 Elasticsearch。因此,为了在时间戳中按日志日期创建索引,我使用 date 过滤器,如下所示:

date {
                "locale" => "en"
                match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
                target => "@timestamp"
        }

我正在使用来自 syslog 的日志,而 syslog 时间戳格式没有年份:

# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}

所以使用日期过滤器后,创建的索引就像logstash-2015.12.26 如果我正在阅读 2014 年 12 月 26 日的日志。因此,由于日志中没有时间戳,因此默认选择当前年份。

知道如何制作正确的索引吗?

【问题讨论】:

    标签: elasticsearch logstash kibana


    【解决方案1】:

    Joda Time 解析的字符串中缺少年份,Logstash 当前默认为 Logstash 进程启动的年份。见github.com/logstash-plugins/logstash-filter-date bug #3。作为临时解决方法,添加一个临时过滤器以将正确的年份 (2014) 附加到时间戳字段的末尾,并调整您的 date filter 模式以包含 YYYY。

    filter {
      mutate {
        replace => ["timestamp", "%{timestamp} 2014"]
      }
      date {
        locale => "en"
        match => ["timestamp",
                  "MMM  d HH:mm:ss YYYY",
                  "MMM dd HH:mm:ss YYYY",
                  "ISO8601"]
      }
    }
    

    【讨论】:

    • 那么除了临时硬编码之外,就没有什么变通办法了吗?
    • 我不相信有,不。好吧,除了在运行 Logstash 的机器上重置时间,但那将是一个非常糟糕的主意。
    【解决方案2】:

    您可以使用日期过滤器将日期字符串转换为日期格式。默认情况下,当您使用日期过滤器时,日志的日期(或日期时间)将覆盖@timestamp。 因此,在您的过滤器中,您不需要目标。如果要将变量字符串转换为日期,只需使用它即可。

    示例: 匹配=> [“时间戳”,“MMM d HH:mm:ss”,“MMM dd HH:mm:ss”,“ISO8601”]

    【讨论】:

      【解决方案3】:

      如果您正在加载的日志文件的文件名中有年份,您可以使用 grok 过滤器提取它,创建一个新字段,其中包含您从 syslog 中提取的日期加上文件名中的年份。

      可以在此处找到如何从文件名中提取日期/时间的示例:Logstash: How to use date/time in a filename as an imported field

      【讨论】:

      • 当日志中不存在年份 YYYY 时,问题作者需要解决方案。在这种情况下,您将如何解决带有未来 MONTH/date 的时间戳?
      【解决方案4】:

      使用 ruby​​ 函数,我能够将日期动态设置为上一年(如果日志日期大于当前 YYYY)。读取事件日期并计算它是否大于当前系统日期。如果是,则减去 365 天,并覆盖时间戳。

      ruby {
         code => 'require "date"
         am_date = "%b %d %H:%M:%S"
         parsed=DateTime.strptime(event.get("timestamp"), am_date)
         m_now=DateTime.now
      
       if parsed>m_now
          parsed=parsed-365
       else
          parsed=parsed
       end
      
       event.set("timestamp", parsed.to_s) '
      }
      

      这将防止对日期进行任何硬编码。

      【讨论】:

        猜你喜欢
        • 2011-10-30
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 2021-12-19
        • 2017-09-22
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多