转载自:https://elasticstack.blog.csdn.net/article/details/114383426

在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON 文件的日志,并把它导入到 Elasticsearch 中。在之前的文章 “Logstash:Data转换,分析,提取,丰富及核心操作” 也有提到过,但是没有具体的例子。总体说来解析 JSON 文件的日志有两种方法:

    在 file input 里使用 JSON codec
在 file input 里不使用 JSON codec,但是在 filter 的部分使用 JSON filter 我们把 JSON 格式的数据解析并导入到 Elasticsearch 的流程如下: 准备数据 我们准备了如下的数据: sample.json {"id": 4,"timestamp":"2019-06-10T18:01:32Z","paymentType":"Visa","name":"Cary Boyes","gender":"Male","ip_address":"223.113.73.232","purpose":"Grocery","country":"Pakistan","pastEvents":[{"eventId":7,"transactionId":"63941-950"},{"eventId":8,"transactionId":"55926-0011"}],"age":46}
{"id": 5,"timestamp":"2020-02-18T12:27:35Z","paymentType":"Visa","name":"Betteanne Diament","gender":"Female","ip_address":"159.148.102.98","purpose":"Computers","country":"Brazil","pastEvents":[{"eventId":9,"transactionId":"76436-101"},{"eventId":10,"transactionId":"55154-3330"}],"age":41} 构建 Logstash 配置文件
使用 json codec input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
codec => "json"
}
} output {
stdout {
codec => rubydebug
}
} 我们运行 Logstash: sudo ./bin/logstash -f logstash_json.conf 上面的命令输出的结果为: 从上面的结果中,我们可以看出来文档被正确地解析。 使用 JSON filter 我们可以在 file input 中不使用任何的 code,但是我们可以可以使用 JSON filter 来完成解析的工作: logstash_json_fileter.conf input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
}
} filter {
json {
source => "message"
} } output {
stdout {
codec => rubydebug
}
} 在上面,我们添加了 filter 这个部分。我们使用了 json 这个过滤器来完成对 JSON 格式的解析。重新运行我们的 Logstash。我们可以看到如下的输出: 在上面,我们可以看到一个叫做 message 的字段。这个字段显然它会占存储空间。我们可以把它删除掉。同时,我们也可以去掉那些不需要的元字段以节省空间。 logstash_json_fileter.conf input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
}
} filter {
json {
source => "message"
} if [paymentType] == "Mastercard" {
drop{}
} mutate {
remove_field => ["message", "path", "host", "@version"]
} } output {
stdout {
codec => rubydebug
}
} 在上面,我们检查 paymentType 是否为 Mastercard,如果是的话,我们把整个事件丢弃。同时我们删除不需要的字段,比如 message, path 等。重新运行 Logstash。我们可以看到如下的输出: 显然这次的输出比刚才的要干净很多。你可能已经注意到 @timestamp 的值和 timestamp 的值不太一样。在 Kibana 中,我们经常会使用 @timestamp 作为事件的时间标签。我们可以做如下的处理: logstash_json_fileter.conf input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
}
} filter {
json {
source => "message"
} if [paymentType] == "Mastercard" {
drop{}
} date {
match => [ "timestamp", "ISO8601" ]
locale => en
} mutate {
remove_field => ["message", "path", "host", "@version", "timestamp"]
} } output {
stdout {
codec => rubydebug
}
} 在上面,我们添加了 date 过滤器来解析时间。同时我们也删除 timestamp 这个字段。我们得到的结果是: 从上面我们可以看出来 @timestamp 的时间现在是时间的 timestamp 字段的时间。 在上面,我们看到 postEvent 是一个数组。如果我们想把这个数组拆分,并把其中的每一个事件作为一个分别的事件。我们可以使用 split 过滤器来完成。 logstash_json_fileter.conf input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
}
} filter {
json {
source => "message"
} if [paymentType] == "Mastercard" {
drop{}
} date {
match => [ "timestamp", "ISO8601" ]
locale => en
} mutate {
remove_field => ["message", "path", "host", "@version", "timestamp"]
} split {
field => "[pastEvents]"
} } output {
stdout {
codec => rubydebug
}
} 从上面我们可以看出来 postEvents 数组被拆分,并形成多个文档。上面的最终文档还是有些美中不足:eventId 及 transactionId 还是处于 pastEvents 对象之下。我们想把它移到和 id 同一级的位置。为此,我们做如下的修改: logstash_json_fileter.conf input {
file {
path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
start_position => "beginning"
sincedb_path => "/dev/null"
}
} filter {
json {
source => "message"
} if [paymentType] == "Mastercard" {
drop{}
} date {
match => [ "timestamp", "ISO8601" ]
locale => en
} split {
field => "[pastEvents]"
} mutate {
add_field => {
"eventId" => "%{[pastEvents][eventId]}"
"transactionId" => "%{[pastEvents][transactionId]}"
} remove_field => ["message", "path", "host", "@version", "timestamp", "pastEvents"]
}
} output {
stdout {
codec => rubydebug
} elasticsearch {
index => "logstash_json"
}
} 重新运行 Logstash。我们可以看到如下的输出: 在上面,我们把 eventId 及 transactionId 移到文档的根下面,并删除 pastEvents 这个字段。我们同时也把文档导入到 Elasticsearch 中。 我们可以在 Elasticsearch 中对文档进行搜索: GET logstash_json/_search {
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "logstash_json",
"_type" : "_doc",
"_id" : "JXZRAHgBoLC90rTy6jNl",
"_score" : 1.0,
"_source" : {
"gender" : "Female",
"@timestamp" : "2020-02-18T12:27:35.000Z",
"id" : 5,
"country" : "Brazil",
"name" : "Betteanne Diament",
"paymentType" : "Visa",
"transactionId" : "76436-101",
"eventId" : "9",
"ip_address" : "159.148.102.98",
"age" : 41,
"purpose" : "Computers"
}
},
{
"_index" : "logstash_json",
"_type" : "_doc",
"_id" : "KHZRAHgBoLC90rTy6jNl",
"_score" : 1.0,
"_source" : {
"gender" : "Male",
"@timestamp" : "2019-06-10T18:01:32.000Z",
"id" : 4,
"country" : "Pakistan",
"name" : "Cary Boyes",
"paymentType" : "Visa",
"transactionId" : "55926-0011",
"eventId" : "8",
"ip_address" : "223.113.73.232",
"age" : 46,
"purpose" : "Grocery"
}
},
...

Logstash:解析 JSON 文件并导入到 Elasticsearch 中的更多相关文章

  1. Logstash:把MySQL数据导入到Elasticsearch中

    Logstash:把MySQL数据导入到Elasticsearch中 前提条件 需要安装好Elasticsearch及Kibana. MySQL安装 根据不同的操作系统我们分别对MySQL进行安装.我 ...

  2. 使用Logstash把MySQL数据导入到Elasticsearch中

    总结:这种适合把已有的MySQL数据导入到Elasticsearch中 有一个csv文件,把里面的数据通过Navicat Premium 软件导入到数据表中,共有998条数据 文件下载地址:https ...

  3. Android--------使用gson解析json文件

    ##使用gson解析json文件 **json的格式有两种:** **1. {}类型,及数据用{}包含:** **2. []类型,即数据用[]包含:** 下面用个例子,简单的介绍gson如何解析jso ...

  4. JAVA简便解析json文件

    JAVA简便解析json文件 首先放上我要解析的json文件: { "resultcode":"200", "reason":"S ...

  5. Logstash解析Json array

    logstash解析json数组是一种常见的需求,我以网上一组数据为例来描述 我们的数据test.json内容如下:(此处我linux上的json文本需要是compact的) {"type& ...

  6. python脚本解析json文件

    python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...

  7. 使用google-gson类库解析json文件

    使用google-gson类库解析json文件 使用JsonParser解析器来解析字符串和输入流,变成json对象 代码如下: public class Readjson { public stat ...

  8. 安卓解析JSON文件

    安卓解析JSON文件 根据JOSN文件的格式,文件只有两种数据,一是对象数据,以 {}为分隔,二是数组,以[]分隔 以下介绍安卓如何解析一个JSON文件,该文件存放在assets目录下,即:asset ...

  9. Java解析JSON文件的方法

    http://blog.sina.com.cn/s/blog_628cc2b70101dydc.html java读取文件的方法 http://www.cnblogs.com/lovebread/ar ...

随机推荐

  1. vue2,vue指令和选项

    vue特点 mvvm框架 响应式(声明式) 组件化(支持自定义组件) 丰富的指令(Dom功能的抽象) 基于选项(template,data,computed,watch,methods) vue文档集 ...

  2. Druid 查询超时配置的探究 → DataSource 和 JdbcTemplate 的 queryTimeout 到底谁生效?

    开心一刻 昨晚跟我妈语音 妈:我年纪有点大了,想抱孩子了 我:妈,我都多大了,你还想抱我? 妈:我想抱小孩,谁乐意抱你呀! 我:刚好小区有人想找月嫂,要不我帮你联系下? 妈:你给我滚 然后她直接把语音 ...

  3. @Convert 注解在jpa中进行查询的注意事项

    如果要实现实体类中属性的类型和数据库表中字段的类型相互转化,则需要使用 @Convert 注解 package javax.persistence; import java.lang.annotati ...

  4. PHP操作路由器

    用PHP操作路由器 我们经常会碰到需要自动换IP的需求,比方模拟点击投票,数据采集被封IP,Alexa作弊等等,也就是需要经常换IP的,我们都可以通过PHP控制路由器来换IP,这样就不需要用按键精灵搞 ...

  5. 基于python3.7利用Motor来异步读写Mongodb提高效率

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_111 如果使用Python做大型海量数据批量任务时,并且backend用mongodb做数据储存时,常常面临大量读写数据库的情况. ...

  6. 9. 利用Docker快速构建MGR | 深入浅出MGR

    目录 1.安装Docker 2.拉取GreatSQL镜像,并创建容器 2.1 拉取镜像 2.2 创建新容器 2.3 容器管理 3.构建MGR集群 3.1 创建专用子网 3.2 创建3个新容器 3.3 ...

  7. WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)

    此案例是<.Net WebView2 项目,实现 嵌入 WEB 页面 Chromium内核>文的续集. 主要是针对WebView2的一些微软自己封装的不熟悉的API,有一些人已经对 Pup ...

  8. Luogu1088 火星人 (康托展开)

    皮一波 #include <iostream> #include <cstdio> #include <cstring> #include <algorith ...

  9. 使用VitePress搭建及部署vue组件库文档

    每个组件库都有它们自己的文档.所以当我们开发完成我们自己的组件库必须也需要一个组件库文档.如果你还不了解如何搭建自己的组件库可以看这里->从零搭建Vue3组件库.看完这篇文章你就会发现原来搭建和 ...

  10. redis-zset命令

    一.BZPOPMAX key [key ...] timeout BZPOPMAX 是有序集合命令 ZPOPMAX带有阻塞功能的版本. 在参数中的所有有序集合均为空的情况下,阻塞连接.参数中包含多个有 ...