【问题标题】:Logstash records from a server being rejected by ElasticSearch due to malformed date由于日期格式错误,来自服务器的 Logstash 记录被 ElasticSearch 拒绝
【发布时间】:2015-10-29 02:26:44
【问题描述】:

我正在安装包括 REDIS 在内的 ELK,并已成功让一台服务器/进程将其日志传送到 ElasticSearch(ES)。 对此最满意。 但是,在更新现有服务器/进程以开始使用 logstash 时,我看到 logdate 以 yyyy-MM-dd HH:mm:ss,sss 的形式出现。 请注意日期和时间之间没有 T。 ES 对此并不满意。

两个服务器使用的 Log4j 模式是:

<PatternLayout pattern="~%d{ISO8601} [%p] [%t] [%c{1.}] %m%n"/>

Logstash 配置与源日志文件的路径不同

input{

    file{
        type => "log4j"
        path => "/var/log/restapi/*.log"
        add_field => {
            "process" => "restapi"
            "environment" => "DEVELOPMENT"
        }
        codec => multiline {

           pattern => "^~%{TIMESTAMP_ISO8601} "
           negate => "true"
           what => "previous"
        }
    }


}

filter{

    if [type] == "log4j"{
        grok{
            match => {
                message => "~%{TIMESTAMP_ISO8601:logdate}%{SPACE}\[%{LOGLEVEL:level}\]%{SPACE}\[%{DATA:thread}\]%{SPACE}\[%{DATA:category}\]%{SPACE}%{GREEDYDATA:messagetext}"
            }            
        }


    }

}

output{
    redis{
        host => "sched01"
        data_type => "list"
        key => "logstash"
        codec => json
    }

    stdout{codec => rubydebug}

}

stdout 行用于当前调试目的,很明显,在正常工作的服务器上,GROK 过滤器正确地形成了 logdate。

与格式不正确的输出相比。

与高级别的唯一区别是服务器的构建时间。 寻找可能导致的想法或将 T 添加到字段中的方法

【问题讨论】:

  • 然后我看到源日期值在日志文件中没有 T 的情况下通过,这使得这现在更像是一个 log4j 问题。为什么类似的 log4j 模式会产生不同的输出。
  • 就是这样。在发现在 log4j2 中发现并修复了一个错误后,发现旧服务正在使用 log4j2 的 beta 版本。稍后更新和构建 POM,并看到数据流。

标签: logstash log4j2 logstash-grok


【解决方案1】:

DatePatternConverter ISO8601_PATTERN 不符合 ISO8601 https://issues.apache.org/jira/browse/LOG4J2-670 导致我检查旧应用程序中使用的 log4j2 库的版本。发现是Beta。更新到 v2.3 并且 dateTime 值开始正确填充。现在该值已正确形成,ElasticSearch 很乐意接受它。

【讨论】:

    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2020-01-25
    • 2014-10-19
    • 1970-01-01
    • 2015-01-27
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多