logstash 年份滚动时间戳

logstash 年份滚动时间戳

我们使用 logstash 来存储/搜索邮件服务器的日志。我今天注意到我们没有今年(2015 年)的任何索引。快速调查显示,当前日志存储为 2014.01.05(即同一天,但去年),并且这些索引被查找旧索引的 cron 作业删除。

重新启动 logstash 解决了这个问题,因此我认为 logstash 会根据启动时间填写年份信息。

我们运行的是 Logstash 1.4.1 和 Elasticsearch 1.2.4。因此不是 Elasticsearch 的最新版本,但我在 1.4.2 的更新日志中没有看到任何相关内容。

日志条目使用下面的 syslog - 配置与输入行和解析输出的示例一起发送到 logstash。

除了记得在新年那天重新启动 Logstash 之外,还有更好的解决办法吗?


输入行示例

Jan  5 15:03:35 cheviot22 exim[15034]: 1Y89Bv-0003uU-DD <= [email protected] H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 [email protected]

{
  "_index": "logstash-2014.01.05",
  "_type": "mails",
  "_id": "HO0TQs66SA-1QkQBYd9Jag",
  "_score": null,
  "_source": {
    "@version": "1",
    "@timestamp": "2014-01-05T15:03:35.000Z",
    "type": "mails",
    "priority": 22,
    "timestamp": "Jan  5 15:03:35",
    "logsource": "cheviot22",
    "program": "exim",
    "pid": "15034",
    "severity": 6,
    "facility": 2,
    "facility_label": "mail",
    "severity_label": "Informational",
    "msg": "1Y89Bv-0003uU-DD <= [email protected] H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 [email protected]",
    "tags": [
      "grokked",
      "exim_grokked",
      "dated"
    ],
    "xid": "1Y89Bv-0003uU",
    "exim_rcpt_kv": "[email protected] H=adudeviis.ncl.ac.uk (campus) [10.8.232.56] P=esmtp S=2548 [email protected]",
    "H": "adudeviis.ncl.ac.uk",
    "P": "esmtp",
    "S": "2548",
    "id": "[email protected]"
  },
  "sort": [
    1388934215000,
    1388934215000
  ]
}

Logstash 配置(已删除不相关的部分)...

input {
    syslog {
        codec => "plain"
        debug => false
        port => 514
        type => "mails"
    }
}

filter {
    mutate {
        remove_field => [ "path", "host" ]
    }

    if [type] == "mails" {
        grok {
            patterns_dir => [ "/etc/logstash/patterns" ]
            match => [ "message",  "(?<msg>.*)" ]
            add_tag => [ "grokked" ]
            break_on_match => true
            remove_field => [ "message" ]
        }
    }

    date {
        match => [ "timestamp", "ISO8601", "MMM dd HH:mm:ss", "MMM  d HH:mm:ss"]
        add_tag => [ "dated" ]
    }
}

output {
        elasticsearch {
                cluster => "logstash"
        host => "iss-logstash01"
        flush_size => 1000
        index => "logstash-%{+YYYY.MM.dd}"
        }
}

答案1

在 logstash-users Google 群组中找到了答案(我忘记了)。最近的讨论指向https://logstash.jira.com/browse/LOGSTASH-1744其 (a) 证实了其他人看到的内容与我相同,且 (b) 提供了几个可能的解决方案。

选项 1 是 Elasticsearch 的一个补丁(不在标准分布中),它更新了 Logstash 对当前年份的想法。

选项 2 是不解析 syslog 行中的时间戳,而是仅依赖消息到达 Logstash 的时间。这可能是我们可以接受的解决方案,因为行的顺序比确切时间更重要(只要它们接近)。

相关内容