logstash 弹性不使用源时间戳

logstash elastic not using source timestamp

当前设置如下所示。

Spring boot -> log-file.json ( using logstash-logback-encoder) -> filebeat -> logstash -> elastic

我可以看到弹性搜索中出现的日志。但是,它不使用日志文件中提供的日期,而是即时创建它们。

json-例子

{  
   "@timestamp":"2017-09-08T17:23:38.677+01:00",
   "@version":1,
   "message":"A received request - withtimestanp",
   etc..

我的 logstash.conf 输入过滤器看起来像这样。

input {
  beats {
    port => 5044
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts    => [ 'elasticsearch' ]
  }
} 

如果您查看日志的 kibana 输出,它是第 9 个而不是第 8 个(当我实际创建日志时)

所以现在已经解决了这个问题。修复的细节如下。

logback.xml

<appender name="stash" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>info</level>
    </filter>
    <file>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>/home/rob/projects/scratch/log-tracing-demo/build/logs/tracing-A.log.%d{yyyy-MM-dd}</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder" >
        <includeContext>false</includeContext>
        <fieldNames>
            <message>msg</message>
        </fieldNames>
    </encoder>
</appender>

将字段 message 重命名为 msg,因为 logstash 期望来自 beat 的消息具有不同的默认值

json-file.log

下面是示例 json 输出的样子

{"@timestamp":"2017-09-11T14:32:47.920+01:00","@version":1,"msg":"Unregistering JMX-exposed beans","logger_name":"org.springframework.jmx.export.annotation.AnnotationMBeanExporter","thread_name":"Thread-19","level":"INFO","level_value":20000}

filebeat.yml

下面的

json 设置现在处理时间戳问题,它没有使用日志文件中的时间。

它还将 json 移动到 json 输出到 logstash 的根目录中。即它没有嵌套在节拍 json 事件中它是根的一部分。

filebeat.prospectors:
- input_type: log
  paths:
    - /mnt/log/*.log
  json.overwrite_keys: true
  json.keys_under_root: true
  fields_under_root: true

output.logstash:
  hosts: ['logstash:5044']

logstash.conf

使用 msg 而不是 message 可以解决 JSON 解析错误,原始数据现在位于 message 字段中。看这里 https://discuss.elastic.co/t/logstash-issue-with-json-input-from-beats-solved/100039

input {
  beats {
    port => 5044
    codec => "json"
  }
}

filter {
  mutate {
    rename => {"msg" => "message"}
  }
}

output {
  elasticsearch {
    hosts    => [ 'elasticsearch' ]
    user     => 'elastic'
    password => 'changeme'
  }
}