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

  1. 在今天的文章中,我们将详述如何使用 Logstash 来解析 JSON 文件的日志,并把它导入到 Elasticsearch 中。在之前的文章 LogstashData转换,分析,提取,丰富及核心操作” 也有提到过,但是没有具体的例子。总体说来解析 JSON 文件的日志有两种方法:
  2. file input 里使用 JSON codec
  3. file input 里不使用 JSON codec,但是在 filter 的部分使用 JSON filter
  4. 我们把 JSON 格式的数据解析并导入到 Elasticsearch 的流程如下:
  5. 准备数据
  6. 我们准备了如下的数据:
  7. sample.json
  8. {"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}
  9. {"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}
  10. 构建 Logstash 配置文件
  11. 使用 json codec
  12. input {
  13. file {
  14. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  15. start_position => "beginning"
  16. sincedb_path => "/dev/null"
  17. codec => "json"
  18. }
  19. }
  20. output {
  21. stdout {
  22. codec => rubydebug
  23. }
  24. }
  25. 我们运行 Logstash:
  26. sudo ./bin/logstash -f logstash_json.conf
  27. 上面的命令输出的结果为:
  28. 从上面的结果中,我们可以看出来文档被正确地解析。
  29. 使用 JSON filter
  30. 我们可以在 file input 中不使用任何的 code,但是我们可以可以使用 JSON filter 来完成解析的工作:
  31. logstash_json_fileter.conf
  32. input {
  33. file {
  34. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  35. start_position => "beginning"
  36. sincedb_path => "/dev/null"
  37. }
  38. }
  39. filter {
  40. json {
  41. source => "message"
  42. }
  43. }
  44. output {
  45. stdout {
  46. codec => rubydebug
  47. }
  48. }
  49. 在上面,我们添加了 filter 这个部分。我们使用了 json 这个过滤器来完成对 JSON 格式的解析。重新运行我们的 Logstash。我们可以看到如下的输出:
  50. 在上面,我们可以看到一个叫做 message 的字段。这个字段显然它会占存储空间。我们可以把它删除掉。同时,我们也可以去掉那些不需要的元字段以节省空间。
  51. logstash_json_fileter.conf
  52. input {
  53. file {
  54. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  55. start_position => "beginning"
  56. sincedb_path => "/dev/null"
  57. }
  58. }
  59. filter {
  60. json {
  61. source => "message"
  62. }
  63. if [paymentType] == "Mastercard" {
  64. drop{}
  65. }
  66. mutate {
  67. remove_field => ["message", "path", "host", "@version"]
  68. }
  69. }
  70. output {
  71. stdout {
  72. codec => rubydebug
  73. }
  74. }
  75. 在上面,我们检查 paymentType 是否为 Mastercard,如果是的话,我们把整个事件丢弃。同时我们删除不需要的字段,比如 message, path 等。重新运行 Logstash。我们可以看到如下的输出:
  76. 显然这次的输出比刚才的要干净很多。你可能已经注意到 @timestamp 的值和 timestamp 的值不太一样。在 Kibana 中,我们经常会使用 @timestamp 作为事件的时间标签。我们可以做如下的处理:
  77. logstash_json_fileter.conf
  78. input {
  79. file {
  80. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  81. start_position => "beginning"
  82. sincedb_path => "/dev/null"
  83. }
  84. }
  85. filter {
  86. json {
  87. source => "message"
  88. }
  89. if [paymentType] == "Mastercard" {
  90. drop{}
  91. }
  92. date {
  93. match => [ "timestamp", "ISO8601" ]
  94. locale => en
  95. }
  96. mutate {
  97. remove_field => ["message", "path", "host", "@version", "timestamp"]
  98. }
  99. }
  100. output {
  101. stdout {
  102. codec => rubydebug
  103. }
  104. }
  105. 在上面,我们添加了 date 过滤器来解析时间。同时我们也删除 timestamp 这个字段。我们得到的结果是:
  106. 从上面我们可以看出来 @timestamp 的时间现在是时间的 timestamp 字段的时间。
  107. 在上面,我们看到 postEvent 是一个数组。如果我们想把这个数组拆分,并把其中的每一个事件作为一个分别的事件。我们可以使用 split 过滤器来完成。
  108. logstash_json_fileter.conf
  109. input {
  110. file {
  111. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  112. start_position => "beginning"
  113. sincedb_path => "/dev/null"
  114. }
  115. }
  116. filter {
  117. json {
  118. source => "message"
  119. }
  120. if [paymentType] == "Mastercard" {
  121. drop{}
  122. }
  123. date {
  124. match => [ "timestamp", "ISO8601" ]
  125. locale => en
  126. }
  127. mutate {
  128. remove_field => ["message", "path", "host", "@version", "timestamp"]
  129. }
  130. split {
  131. field => "[pastEvents]"
  132. }
  133. }
  134. output {
  135. stdout {
  136. codec => rubydebug
  137. }
  138. }
  139. 从上面我们可以看出来 postEvents 数组被拆分,并形成多个文档。上面的最终文档还是有些美中不足:eventId transactionId 还是处于 pastEvents 对象之下。我们想把它移到和 id 同一级的位置。为此,我们做如下的修改:
  140. logstash_json_fileter.conf
  141. input {
  142. file {
  143. path => [ "/Users/liuxg/data/logstash_json/sample.json" ]
  144. start_position => "beginning"
  145. sincedb_path => "/dev/null"
  146. }
  147. }
  148. filter {
  149. json {
  150. source => "message"
  151. }
  152. if [paymentType] == "Mastercard" {
  153. drop{}
  154. }
  155. date {
  156. match => [ "timestamp", "ISO8601" ]
  157. locale => en
  158. }
  159. split {
  160. field => "[pastEvents]"
  161. }
  162. mutate {
  163. add_field => {
  164. "eventId" => "%{[pastEvents][eventId]}"
  165. "transactionId" => "%{[pastEvents][transactionId]}"
  166. }
  167. remove_field => ["message", "path", "host", "@version", "timestamp", "pastEvents"]
  168. }
  169. }
  170. output {
  171. stdout {
  172. codec => rubydebug
  173. }
  174. elasticsearch {
  175. index => "logstash_json"
  176. }
  177. }
  178. 重新运行 Logstash。我们可以看到如下的输出:
  179. 在上面,我们把 eventId transactionId 移到文档的根下面,并删除 pastEvents 这个字段。我们同时也把文档导入到 Elasticsearch 中。
  180. 我们可以在 Elasticsearch 中对文档进行搜索:
  181. GET logstash_json/_search
  182. {
  183. "took" : 1,
  184. "timed_out" : false,
  185. "_shards" : {
  186. "total" : 1,
  187. "successful" : 1,
  188. "skipped" : 0,
  189. "failed" : 0
  190. },
  191. "hits" : {
  192. "total" : {
  193. "value" : 4,
  194. "relation" : "eq"
  195. },
  196. "max_score" : 1.0,
  197. "hits" : [
  198. {
  199. "_index" : "logstash_json",
  200. "_type" : "_doc",
  201. "_id" : "JXZRAHgBoLC90rTy6jNl",
  202. "_score" : 1.0,
  203. "_source" : {
  204. "gender" : "Female",
  205. "@timestamp" : "2020-02-18T12:27:35.000Z",
  206. "id" : 5,
  207. "country" : "Brazil",
  208. "name" : "Betteanne Diament",
  209. "paymentType" : "Visa",
  210. "transactionId" : "76436-101",
  211. "eventId" : "9",
  212. "ip_address" : "159.148.102.98",
  213. "age" : 41,
  214. "purpose" : "Computers"
  215. }
  216. },
  217. {
  218. "_index" : "logstash_json",
  219. "_type" : "_doc",
  220. "_id" : "KHZRAHgBoLC90rTy6jNl",
  221. "_score" : 1.0,
  222. "_source" : {
  223. "gender" : "Male",
  224. "@timestamp" : "2019-06-10T18:01:32.000Z",
  225. "id" : 4,
  226. "country" : "Pakistan",
  227. "name" : "Cary Boyes",
  228. "paymentType" : "Visa",
  229. "transactionId" : "55926-0011",
  230. "eventId" : "8",
  231. "ip_address" : "223.113.73.232",
  232. "age" : 46,
  233. "purpose" : "Grocery"
  234. }
  235. },
  236. ...

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. dynamic + shardingsphere(4.1.1) 实现动态分库分表

    1. 主要依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-da ...

  2. mysql面试题整理

    1 myisam 和 innodb 引擎的区别 innodb 支持事务,外键,myisam 不支持 innodb 支持 mvcc ,myisam 不支持 innodb 支持表锁.行锁,myisam 仅 ...

  3. 【一本通基础DP基础模型】摘花生

    题面 题目描述 Hello Kitty想摘点花生送给她喜欢的米老鼠.她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来.地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生, ...

  4. 洛谷 P2073 送花 treap 无指针

    看了那么多题解都没做对,结果今早上按自己的思路和模板做了做,然后过了. 平衡树裸题 直接上代码: #include<bits/stdc++.h> #define rint register ...

  5. efcore在Saas系统下多租户零脚本分表分库读写分离解决方案

    efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...

  6. Netty源码解读(四)-读写数据

    读写Channel(READ)的创建和注册 在NioEventLoop#run中提到,当有IO事件时,会调用processSelectedKeys方法来处理. 当客户端连接服务端,会触发服务端的ACC ...

  7. VP视频结构化框架

    完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...

  8. 一些JS库汇总

    作者:wlove 链接:https://www.zhihu.com/question/429436558/answer/2348777302 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  9. ArrayList的操作和对象数组

    ArrayList是List接口的一个实现类,它是程序中最常见的一种集合. ArrayList内部的数据存储结构时候数组形式,在增加或删除指定位置的元素时,会创建新的数组,效率比较低,因此不适合做大量 ...

  10. python代码如何写的优雅?

    简介 在实际项目中,我们可能一开始为了完成功能而忽视了代码的整体质量,因此,使用一些高阶的函数或方法,能够更加使我们的代码更加优雅.废话不多说,现在马上开始. 使用enumerate方法替代range ...