Logstash 由于日期格式错误,ElasticSearch拒绝服务器的日志存储记录

Logstash 由于日期格式错误,ElasticSearch拒绝服务器的日志存储记录,logstash,log4j2,logstash-grok,Logstash,Log4j2,Logstash Grok,我正在安装ELK,包括REDIS,并已成功获得一台服务器/进程,将其日志传送到ElasticSearch(ES)。 我对此非常满意。 但是,在更新现有服务器/进程以开始使用logstash时,我看到logdate的格式是yyyy-MM-dd HH:MM:ss,sss。 注意日期和时间之间没有T。埃斯对此并不满意 两台服务器使用的Log4j模式是: <PatternLayout pattern="~%d{ISO8601} [%p] [%t] [%c{1.}] %m%n"/> stdo

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

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

<PatternLayout pattern="~%d{ISO8601} [%p] [%t] [%c{1.}] %m%n"/>
stdout行用于当前调试目的,因此很明显,在正常工作的服务器上,GROK过滤器正确地形成了logdate。

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

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

DatePatternConverter ISO8601_模式下出现的错误不符合ISO8601要求我检查旧应用程序中使用的log4j2库的版本。发现它是测试版。已更新到v2.3,并且开始正确填充日期时间值。值现在格式正确,ElasticSearch很乐意接受它。

然后我看到源日期值在日志文件中没有T,这使得这现在更像是一个log4j问题。为什么相似的log4j模式会产生不同的输出,就是这样。在发现log4j2中已识别并修复了一个bug之后,发现较旧的服务正在使用log4j2的beta版本。POM更新和构建之后,我看到了数据流。
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}

}