`

解决filebeat的@timestamp无法被json日志的同名字段覆盖的问题

    博客分类:
  • ELK
 
阅读更多
默认@timestamp是filebeat读取日志时的时间戳,但是我们在读取日志的时候希望根据日志生成时间来展示,以便根据日志生成时间点来定位问题。

这是我生成json日志的格式:

{"@timestamp":"2017-03-23T09:48:49.304603+08:00","@source":"vagrant-ubuntu-trusty-64","@fields":{"channel":"xhh.mq.push","level":200,"ctxt_queue":"job_queue2","ctxt_exchange":"","ctxt_confirm_selected":true,"ctxt_confirm_published":true,"ctxt_properties":{"confirm":true,"transaction":false,"exchange":[],"queue":[],"message":[],"consume":[],"binding_keys":[],"exchange2":{"type":"direct"}}},"@message":"904572:58d31d7ddc790:msg_param1~","@tags":["xhh.mq.push"],"@type":"xhh.mq.push"}
日志中包含了@timestamp,但是用filebeat收集日志后,@timestamp被filebeat自动生成的时间给覆盖了:

{
        "offset" => 413806671,
       "@source" => "vagrant-ubuntu-trusty-64",
         "@tags" => [
        [0] "xhh.mq.push"
    ],
         "@type" => "xhh.mq.push",
    "input_type" => "log",
        "source" => "/tmp/xhh_mq_20170323.log",
          "type" => "rabbitmq",
       "@fields" => {
                 "ctxt_exchange" => "",
         "ctxt_confirm_selected" => true,
                         "level" => 200,
                       "channel" => "xhh.mq.push",
               "ctxt_properties" => {
                 "confirm" => true,
               "exchange2" => {
                "type" => "direct"
            },
                "exchange" => nil,
                 "consume" => nil,
                 "message" => nil,
             "transaction" => false,
                   "queue" => nil,
            "binding_keys" => nil
        },
                    "ctxt_queue" => "job_queue0",
        "ctxt_confirm_published" => true
    },
          "tags" => [
        [0] "beats_input_raw_event"
    ],
      "@message" => "995428:58d31d7ddc790:msg_param1~",
    "@timestamp" => 2017-03-24T01:00:00.930Z,
          "beat" => {
        "hostname" => "vagrant-ubuntu-trusty-64",
            "name" => "vagrant-ubuntu-trusty-64",
         "version" => "5.2.1"
    },
      "@version" => "1",
          "host" => "vagrant-ubuntu-trusty-64"
}
时间变成了filebeat读取日志时的时间,这完全不是我想要的,没办法网上找解决方式,发现GitHub官网也有人在问同个问题,链接地址:https://github.com/logstash-plugins/logstash-input-beats/issues/33

话说好像是bug?评论里说可以用grok进行转换,即在日志里先定义一个messageTimestamp字段,然后filebeat推到logstash后再通过filter配置将其转换为logstash的timestamp,貌似这也可以,不过应该会有更简便的解决方式的才对。在万能的谷哥引导下,原来filebeat最新版已经解决了这个问题了~ So就是这里了:https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#config-json

在filebeat.yml配置文件中加上以下两行搞定:

json.keys_under_root: true
json.overwrite_keys: true
文档里json共有四个配置节点:

keys_under_root

默认这个值是FALSE的,也就是我们的json日志解析后会被放在json键上。设为TRUE,所有的keys就会被放到根节点。
overwrite_keys

是否要覆盖原有的key,这是关键配置,将keys_under_root设为TRUE后,再将overwrite_keys也设为TRUE,就能把filebeat默认的key值给覆盖了。
add_error_key

添加json_error key键记录json解析失败错误
message_key

指定json日志解析后放到哪个key上,默认是json,你也可以指定为log等。
分享到:
评论

相关推荐

    ELK解决8小时的时间误差

    新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。 Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、...

    tomcat日志json化.txt

    - **beats**:此段配置指定了Logstash接收来自Filebeat等Beat工具发送的日志数据的端口。此处使用的是`beats`插件,并设置了端口号为`9988`。 ##### 2.2 Filter(过滤器) ```yaml filter{ grok{...} date{...} ...

    nginx中用JSON格式记录日志的配置示例

    传统的日志格式可能包含时间戳、客户端IP、请求方法、状态码等信息,但在复杂环境下,传统的日志格式可能已经无法满足日志分析工具如Logstash的需求。这时,使用JSON格式记录日志就显得尤为重要。 JSON(JavaScript...

    基于ELK的nginx-qps监控解决方案.docx

    log_format json '{"@timestamp":"$time_iso8601","@version":"1","server_addr":"$server_addr","remote_addr":"$remote_addr","host":"$host","uri":"$uri","body_bytes_sent":$body_bytes_sent,"bytes_sent":$...

    使用TimeStamp控制并发问题示例

    Timestamp是并发控制的一种策略,主要用于解决更新丢失(Lost Update)等并发问题。本示例将详细介绍如何在数据库中利用Timestamp来防止并发操作导致的数据不一致。 Timestamp的基本原理是为每条记录分配一个时间戳...

    json转换工具,支持日期

    `TimestampProcessor`可能会实现`net.sf.json.JSONObject$Processor`接口,覆盖`processObjectEntry()`方法,以处理`Timestamp`到JSON和JSON到`Timestamp`的转换。 3. `SqlDateProcessor.java`和`UtilDateProcessor...

    MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数

    在MySQL 5.6中,`TIMESTAMP`数据类型和`explicit_defaults_for_timestamp`参数是数据库管理和时间戳处理的关键元素。`TIMESTAMP`通常用于记录数据记录的创建或修改时间,而`explicit_defaults_for_timestamp`参数则...

    【源码阅读】 protobuf 中的 timestamp 包

    文章目录Timestamptimestamp.go如何使用 Timestamp path: google/protobuf/timestamp.proto 在 timestamppb 中 Timestamp 包含两个字段 seconds 表示秒 nanos 表示纳秒 message Timestamp { int64 seconds = 1; ...

    海量日志采集、解析实践.pdf

    日志解析通常涉及到JSON格式的数据,例如:“@timestamp”、“@timegenerated”、“fromhost-ip”等字段,用于记录时间戳、来源IP和事件类型等信息。初级富化日志检索会进一步添加上下文信息,如请求方法、源地址、...

    文件自动归档,设置json

    这段代码首先打开并解析JSON配置文件,然后遍历每个规则,查找匹配的文件并将其移动到相应的归档目录。`shutil.move()`函数用于移动文件,同时创建目标目录如果它不存在。 为了实现自动化,我们可以把这个脚本设置...

    JSON.zip_JSON_json 时间戳

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它采用完全独立于语言的文本格式,但也使用了类似于C家族语言(包括C、C++、C#、Java、JavaScript、Perl、Python等)的习惯,这使得JSON成为理想的...

    有关java中的Date,String,Timestamp之间的转化问题

    Java 中的 Date、String 和 Timestamp 之间的转换问题 Java 中的日期和时间处理是编程中非常重要的一方面,Date、String 和 Timestamp 是三种常用的日期和时间类型,本文将详细介绍它们之间的转换问题。 一、获取...

    C#更新SQLServer中TimeStamp字段(时间戳)的方法

    同时,需要注意的是,当有多个用户同时修改同一行数据时,最后提交更改的用户将覆盖其他人的更改,因此在实际应用中可能需要结合事务处理以确保数据一致性。 在进行并发控制时,可以考虑以下几点: - 使用`乐观锁`...

    json格式用到的包

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,被广泛用于Web应用程序之间传递数据。它基于JavaScript的一个子集,具有易于人阅读和编写,同时也易于机器解析和生成的特点。JSON格式通常用于替代...

    oracle中TIMESTAMP与DATE比较

    在Oracle数据库中,`TIMESTAMP`与`DATE`两种数据类型是用于存储日期和时间信息的关键组成部分,但它们之间存在显著的区别,特别是在处理时间和精度方面。本文将深入探讨这两种数据类型的特点,以及如何在实际应用中...

    ELK日志收集系统讲析

    - 查询页面体验不佳,可能存在查询结果不连贯、无法导出等问题。 - 对于非常大量的日志数据,Elasticsearch可能会遇到性能瓶颈。 - 在某些情况下,系统可能不支持跨索引查询,这限制了数据的综合分析能力。 - 单次...

    Go-zerolog包提供了一个专用于JSON输出的快速简单记录器

    "Go-zerolog包"是一个专为JSON日志输出设计的高效轻量级库,它在满足日志记录需求的同时,提供了简洁的API和较小的体积,使得在项目中集成变得尤为便捷。 zerolog的设计目标是性能和易用性的平衡。它以JSON格式输出...

    获取当前时间的时间戳并保存到日志

    点击获取当前时间的时间戳并保存到日志文件,带简单图形界面

    Newtonsoft.Json使用总结

    ### Newtonsoft.Json 使用总结 #### 一、初识 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于 JavaScript 的一个子集,并且采用了类似...

Global site tag (gtag.js) - Google Analytics