【问题标题】:logstash elastic not using source timestamplogstash 弹性不使用源时间戳
【发布时间】:2017-09-11 22:10:58
【问题描述】:

当前设置如下所示。

Spring boot -> log-file.json (使用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 个(当我实际创建日志时)

【问题讨论】:

  • 恐怕是a bug。还有another discussion关于它。
  • 解决方案是将您的时间戳放在另一个字段中(例如time),并使用mutate 过滤器和replace 将时间戳字段更改为time 中的值字段。

标签: parsing timestamp logstash elastic-stack


【解决方案1】:

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

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>

将字段消息重命名为 msg,因为从 beat 传入时,logstash 期望消息的默认值不同

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'
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多