【问题标题】:Transform String into JSON so that it's searchable in Kibana/Elasticsearch将 String 转换为 JSON,以便在 Kibana/Elasticsearch 中可搜索
【发布时间】:2020-12-04 09:18:58
【问题描述】:

我在 Windows 机器上运行 ElasticsearchFilebeatKibanaFilebeat log 有一个正确的日志文件并且正在监听路径。当我查看Kibana 中的数据时,它看起来很好。

我的问题是 message 字段是一个字符串。

一个日志行的示例:

12:58:09.9608 Trace {"message":"No more Excel rows found","level":"Trace","logType":"User","timeStamp":"2020-08-14T12:58:09.9608349+02:00","fingerprint":"226fdd2-e56a-4af4-a7ff-724a1a0fea24","windowsIdentity":"mine","machineName":"NAME-PC","processName":"name","processVersion":"1.0.0.1","jobId":"957ef018-0a14-49d2-8c95-2754479bb8dd","robotName":"NAME-PC","machineId":6,"organizationUnitId":1,"fileName":"GetTransactionData"}

所以我现在想要的是将字符串转换为 JSON,以便可以在 Kibana 中搜索 level 字段。

我已经看过Filebeat。在那里我尝试启用 LogStash 。但随后数据不再进入 Elasticsearch。并且日志文件也不会生成到LogStash 文件夹中。

然后我通过install guide下载了LogStash,但不幸的是我收到了这条消息:

C:\Users\name\Desktop\logstash-7.8.1\bin>logstash.bat 
Sending
Logstash logs to C:/Users/mine/Desktop/logstash-7.8.1/logs which
is now configured via log4j2.properties ERROR: Pipelines YAML file is
empty. Location:
C:/Users/mine/Desktop/logstash-7.8.1/config/pipelines.yml usage:  
bin/logstash -f CONFIG_PATH [-t] [-r] [] [-w COUNT] [-l LOG]  
bin/logstash --modules MODULE_NAME [-M
"MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.VARIABLE_NAME=VALUE"] [-t]
[-w COUNT] [-l LOG]   bin/logstash -e CONFIG_STR [-t] [--log.level
fatal|error|warn|info|debug|trace] [-w COUNT] [-l LOG]   bin/logstash
-i SHELL [--log.level fatal|error|warn|info|debug|trace]   bin/logstash -V [--log.level fatal|error|warn|info|debug|trace]  
bin/logstash --help
[2020-08-14T15:07:51,696][ERROR][org.logstash.Logstash    ]
java.lang.IllegalStateException: Logstash stopped processing because
of an error: (SystemExit) exit

编辑:

我尝试只使用Filebeat。我在这里设置:

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  - add_docker_metadata: ~
  - add_kubernetes_metadata: ~
  - dissect: 
      tokenizer: '"%{event_time} %{loglevel} %{json_message}"' 
      field: "message" 
      target_prefix: "dissect"
  - decode_json_fields: 
      fields: ["json_message"]

但这给了我:

dissect_parsing_error

删除tokenizer 处的“”的提示有所帮助。然后我得到了:

我只是刷新了索引,消息就消失了。不错。

但现在的问题是,如何过滤新领域的内容?

【问题讨论】:

  • 您应该配置 logstash.yml 并制作管道。您可以将管道路径添加到 pipeline.conf。我建议您搜索示例 logstash 管道配置。
  • 也许你知道如何在没有logstash的情况下做到这一点?

标签: elasticsearch logstash filebeat


【解决方案1】:

消息说,您的管道配置为空。看来您还没有配置任何管道。 Logstash 可以解决问题 (JSON filter plugin),但 Filebeat 在这里就足够了。如果您不想引入其他服务,这是更好的选择。

它具有decode_json_fields 选项,可将事件中包含 JSON 的特定字段转换为 .这是documentation

对于未来的情况,您的整个事件都是 JSON,有可能在配置 json.message_key 和相关的 json.* 选项的 filebeat 中进行解析。

编辑 - 添加 filebeat sn-p 作为dissectingprocessors 示例,将日志行添加到三个字段(event_time、loglevel、json_message)中。之后将最近提取的字段 json_message,其值为编码为字符串的 JSON 对象,将 decoded 转换为 JSON 结构:

 ... 

filebeat.inputs: 
  - type: log 
    paths: 
      - path to your logfile
  
processors: 
  - dissect: 
      tokenizer: '%{event_time} %{loglevel} %{json_message}' 
      field: "message" 
      target_prefix: "dissect"

  - decode_json_fields: 
      fields: ["dissect.json_message"]
      target: ""

  - drop_fields:
      fields: ["dissect.json_message"]


 ... 

如果您想练习 filebeat 处理器,请尝试设置正确的事件时间戳,该时间戳取自编码的 json 并使用timestamp processor 写入@timestamp。

【讨论】:

  • JSON 过滤器听起来很完美。但我不确定我需要访问哪个文件并将这些过滤器行写入。 Filebeat 现在会发生什么?我还需要那个工具吗?还有配置呢,那里需要哪个连接?
  • 你的场景是什么样的?有多少台机器以及计划的数据流是什么样的?如果您有多台机器在它们上部署 filebeat 并尝试解决已经存在的解析/映射(filebeat.yml)。在我看来,这将是你的捷径。但是如果你不能,设置一个logstash并将beats事件转发到logstash,而不是直接转发到集群。 Logstash 有一个 logstash.yml 和一个 pipelines.yml。如果您需要多个管道,请使用 pipelines.yml,一次编辑 logstash.yml。在此处设置 logstash 管道的位置,如下所述:https
  • 我的任务很简单。我有一个包含一些日志文件的文件夹。那些从上面的例子中得到了这种信息。在该机器上,我现在希望能够搜索消息内容。
  • 好的,尝试省略 logstash 以支持节拍。 Samller 且易于设置。在此处遵循本指南elastic.co/guide/en/beats/filebeat/7.8/…
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多