我们如何在Filebeat输出文件中制作单行JSON

时间:2019-04-09 14:13:23

标签: elastic-stack filebeat

我使用FileBeat转换apache2日志并转储到输出文件中。对于每个apache2日志消息,generate输出文件都有一个JSON主体。但是在这里,我需要在一行中显示JSON正文,而不是进行解析。

使用当前格式,我无法从输出文件中获取每个JSON主体,如果我们保留逐行JSON,则可以拆分输出文件的每一行,并且可以轻松地获取每个JSON主体。

我修改了filebeat.yml文件的输出配置。像下面的

output.file:   路径:“ / tmp / logstojson / apache2 /”   文件名:filebeat   权限:0600   codec.json:     漂亮:错误

我在输出文件中找不到预期的格式。

实际输出文件数据:

{ "@timestamp": "2019-04-09T13:12:47.106Z", 

  "@metadata": {

    "beat": "filebeat",

    "type": "doc",

    "version": "6.6.2",

    "pipeline": "filebeat-6.6.2-system-auth-pipeline"

  },

  "fileset": {

    "module": "system",

    "name": "auth"

  },

  "prospector": {

    "type": "log"

  },

  "input": {

    "type": "log"

  },

  "source": "/var/log/auth.log",

  "log": {

    "file": {

      "path": "/var/log/auth.log"

    }

  },

  "message": "Apr  9 13:12:45 ip-172-31-22-12 sudo: 
pam_unix(sudo:session): session closed for user root",

  "event": {

    "dataset": "system.auth"

  },

  "beat": {

    "version": "6.6.2",

    "name": "ip-172-31-22-12",

    "hostname": "ip-172-31-22-12"

  },

  "host": {

    "name": "ip-172-31-22-12"

  },

  "offset": 537068

}

预期的输出文件数据:

{ "@timestamp": "2019-04-09T13:12:47.106Z", "@metadata": {  "beat": "filebeat", "type": "doc", "version": "6.6.2",  "pipeline": "filebeat-6.6.2-system-auth-pipeline" }, "fileset": { "module": "system", "name": "auth" }, "prospector": { "type": "log" }, "input": { "type": "log" }, "source": "/var/log/auth.log", "log": { "file": {  "path": "/var/log/auth.log" } }, "message": "Apr  9 13:12:45 ip-172-31-22-12 sudo: pam_unix(sudo:session): session closed for user root", "event": { "dataset": "system.auth" }, "beat": { "version": "6.6.2", "name": "ip-172-31-22-12",  "hostname": "ip-172-31-22-12"  }, "host": { "name": "ip-172-31-22-12" }, "offset": 537068}

1 个答案:

答案 0 :(得分:0)

这不是一个完整的答案,但是如果设置codec.json: pretty: false时没有区别,这是正常的,因为默认值已经为false(请参阅:filebeat codec doc

我可以看到的另一种解决方案是通过codec.format: string: '%{[@timestamp]} %{[message]}'

手动格式化json输出

但这远非干净或有效的(如果您的输入有一定程度的变化或复杂性,如果不是完全不可能的话)

也许FB支持该页面中未记录的其他编解码器; ES的文档有时可能缺乏精度,因此值得进行调查。

另一方面,如果您需要在日志中使用这种转换/格式化功能,则可以考虑使用logstash(或者,如果您还需要FB的轻型运输,请同时使用FB和LS)。 LS支持文件或filebeat输入和文件输出,并且它基本上是比FB更完善的ETL实用程序(后者是轻量级转发器)。对于此类问题,您应该明确考虑。 (请参阅LS文件输出文档:By default, this output writes one event per line in json format. You can customise the line format using the line codec like