首页 > 解决方案 > 我们如何在filebeat输出文件中制作单行json

问题描述

我使用 FileBeat 将 apache2 日志转换为输出文件。生成的输出文件对于每个 apache2 日志消息都有一个 JSON 正文。但在这里我需要 JSON 正文而不是解析。

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

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

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

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

实际输出文件数据:

{ "@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}

标签: elastic-stackfilebeat

解决方案


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

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

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

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

另一方面:如果您需要对日志进行这种转换/格式化功能,您可能需要考虑使用 logstash(或者,如果您还需要 FB 的轻量级传输,请同时使用 FB 和 LS)。LS 支持文件或文件节拍输入和文件输出,它基本上只是一个比 FB 更完整的 ETL 实用程序(它更像是一个轻量级转发器)。对于此类问题,您应该明确地考虑它。(请参阅 LS 文件输出文档:默认情况下,此输出以 json 格式每行写入一个事件。您可以使用行编解码器自定义行格式,例如


推荐阅读