热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

logstash+grok+json+elasticsearch解析复杂日志数据(二)

接着上面一篇来说,这篇主要介绍logstash处理实时数据问题,日志数据更新时,logstash处理方式是默认每15s检查一次文件夹,每5秒检查一次文件,这些参数可以改变的。遇

       接着上面一篇来说,这篇主要介绍logstash处理实时数据问题,日志数据更新时,logstash处理方式是默认每15s检查一次文件夹,每5秒检查一次文件,这些参数可以改变的。遇到当处理较多批次数据时,logstash出现卡死状态的原因,我目前猜测是输入文件较多logstash处理很快,而输出插件input elasticsearch这个插件线程限制,导致的死锁问题,后面详细说。最后展示一下kibana日志数据时区从UTC改成显示北京时间的几个方法,最后展示一下仪表盘效果。

       先上logstsh中配置文件代码:

input { 
  file{
    path => ["/home/cuixuange/Public/elk/test_log/*.log","/home/cuixuange/Public/elk/test_log/logs/*"]
    start_position=>"beginning"

     discover_interval => 15
     stat_interval => 1
     sincedb_write_interval => 15
   } 
}

filter{

  grok{
    match=>{ "message" => "(?m)%{DATA:timestamp}  \[%{DATA:ip}\] . \[%{DATA:type}\] %{GREEDYDATA:log_json}"  
           }
  }
  json {
        source => "log_json"
        target => "log_json_content"
        remove_field=>["logjson"]
  }
 # json {
 #       source => "trace"
 #       target => "trace_content"
 #       remove_field=>["trace"]
 # }

  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss" ]
    locale => "en"
    timezOne=>"+00:00"
  }


}

output {
   if[timestamp]=~/^\d{4}-\d{2}-\d{2}/{
     elasticsearch {
         host => "192.168.172.128"
         index => "logstash-test-%{+yyyy.MM.dd}"   #logstash-* to find
         workers=>5
         template_overwrite =>true
     }
  }
   #stdout{codec=>json_lines}
}




简单解释解释意思:

1.

start_position=>"beginning"

logstash默认是ending,意味着每次重新打开logstash它不会从头加载文件,而是会从ending检查是否更新,毕竟实际中一般logstash实时性强,不会随意关闭的,而我们做实验就改成begining,否则不会发现文件内容的出现;

但是这样也就造成一个问题,多次重新打开logstash进行 -f 配置文件时,会造成数据重复读取,想elasticsearch再传一篇数据,es中搜索数据重复(亲测如此),比较繁琐的办法就是把elasticsearch索引删除,以前的数据就不会存在了

2. 

  discover_interval => 15
 #设置多长时间扫描目录,发现新文件
    stat_interval => 1
#设置多长时间检测文件是否修改
     sincedb_write_interval => 15
#设置多长时间会写入读取的位置信息

3.
timezOne=>"+00:00"

elasticsearch原生支持date类型,json格式通过字符来表示date类型。所以在用json提交日期至elasticsearch的时候,es会隐式转换,把es认为是date类型的字符串直接转为date类型

也就是说es存储的时间是long存储的

更改ES 中显示@timestamp字段不是标准时间,小了8个小时原因,是因为我们读入的数据是北京时间转化为0时区存储再然后在kibana展示都是正确的。如果强行修改@timestamp,还需要在kibana上面修改。繁琐了


如果不行的话,可以采用下面的办法:

老版本(1.5之前的版本):
WithZone (org. Joda. Time. DateTimeZone: : UTC)
修改为:
WithZone (org. Joda. Time. DateTimeZone.getDefault ())

1.5以后的版本:
路径:/vendor/bundle/jruby/1.9/gems/logstash-core-(version)-java/lib/logstash/event.rb

我的例子(2.1版本的Logstash):
/logstash/vendor/bundle/jruby/1.9/gems/logstash-core-2.1.0-java/lib/logstash/timestamp.rb
57行
UTC = org.joda.time.DateTimeZone.forID(“UTC”)
修改为:
UTC = org.joda.time.DateTimeZone.getDefault(:)

4.
workers=>5

意即工作线程。Logstash 会运行多个线程。注意:Logstash目前还不支持输入插件的多线程。而输出插件的多线程需要在配置内部设置,这个命令行参数只是用来设置过滤插件的!提示:Logstash 目前不支持对过滤器线程的监测管理。如果 filterworker 挂掉,Logstash 会处于一个无 filter 的僵死状态。

提示:Logstash 目前不支持对过滤器线程的监测管理。如果 filterworker 挂掉,Logstash 会处于一个无 filter 的僵死状态。(我当时发现elasticsearch仅仅读入了一个文件)这种情况在使用 filter/ruby 自己写代码时非常需要注意,很容易碰上 NoMethodError: undefined method '*' for nil:NilClass 错误。需要妥善处理,提前判断。

所以说会出现文章开头的情况:下面是网上有几个的说法+我自己的猜测:

报错类似于:

[2014-02-07 16:11:36,681][WARN ][monitor.jvm              ] [Warwolves] [gc][young][30][12] duration [1.1m], collections [11]/[3.1m], total [1.1m]/[1.1m], memory [485.9mb]->[1.9gb]/[15.9gb], all_pools {[young] [459.7mb]->[442.3mb]/[599mb]}{[survivor] [26.1mb]->[74.8mb]/[74.8mb]}{[old] [0b]->[1.4gb]/[15.2gb]}
[2014-02-07 16:11:47,451][WARN ][monitor.jvm              ] [Warwolves] [gc][young][34][13] duration [7.4s], collections [1]/[7.7s], total [7.4s]/[1.2m], memory [2gb]->[1.6gb]/[15.9gb], all_pools {[young] [594.1mb]->[8.9mb]/[599mb]}{[survivor] [74.8mb]->[74.8mb]/[74.8mb]}{[old] [1.4gb]->[1.5gb]/[15.2gb]}
[2014-02-07 16:12:06,311][WARN ][monitor.jvm              ] [Warwolves] [gc][young][41][15] duration [3.3s], collections [1]/[3.4s], total [3.3s]/[1.3m], memory [2.3gb]->[1.9gb]/[15.9gb], all_pools {[young] [562.1mb]->[8.5mb]/[599mb]}{[survivor] [74.8mb]->[74.8mb]/[74.8mb]}{[old] [1.7gb]->[1.8gb]/[15.2gb]}
[2014-02-07 16:16:52,440][WARN ][monitor.jvm              ] [Warwolves] [gc][young][42][33] duration [2.2m], collections [18]/[4.7m], total [2.2m]/[3.5m], memory [1.9gb]->[4.1gb]/[15.9gb], all_pools {[young] [8.5mb]->[72.5mb]/[599mb]}{[survivor] [74.8mb]->[74.8mb]/[74.8mb]}{[old] [1.8gb]->[4gb]/[15.2gb]}
线程猜测:
input文件夹内部有较多文件,logstash input filter线程限制为1,不能更改output的输出到elasticsearch插件我的线程限制为5
待输入文件较多而每份文件却较小  ; 我猜测logstash进行grok解析后存储只同时只能向elasticsearch写5个文件(我自己写的配置文件限制为5),发生了死锁(似乎不满足死锁发生的4个条件,不过确实卡死了)
内存猜测:
elasticsearch是单节点的,而我用的1g内存的虚拟机,可能是内存不足而logstash没有预警处理(logstash不能检测内部几种插件线程处理的状态,不过在最新的几个版本kibana似乎可以进行检测了)(所以会存在一些数据库,比如说redis等nosql型作为日志数据的缓冲,防止一次性输入过多日志导致的崩溃,不过我们ELK还是更关注于实时数据,不太可能出现日志突然大量增加的情况)
插件本身问题猜测:
一些数据不是json型却被按照json格式解析,可能崩溃出错,也许自己编写的程序不够健壮;
解决:
单个文件不断手动加入更新,发现没有问题,全部显示,所以:内存不足的可能性排除、插件本身代码错误排除(不是json数据按照json插件进行处理还是有只不过会报错出来问题)



5.其它了解:

elastic数据无故丢失,分布式系统很难保证100%数据不丢失
解决方案:1.分布式系统的错误会服,比如说快照  2.数据备份
elasticsearch自动建立了mapping映射,例如:将@timestamp字段映射为date类型;将message字段映射为string类型等等


展示一下kibana最后简单弄了一张仪表盘的效果,挺简单的,不过还是觉得图样太少了....



附上当时解决问题的几个博客链接:


Logstash之时区问题的建议和修改

Logstash处理json格式日志文件的三种方法

Log4J & elk 事故总结,就是我上面说的logstash导入多文件时报错问题

同上

Logstash configuration配置语法






推荐阅读
  • Summarize function is doing alignment without timezone ?
    Hi.Imtryingtogetsummarizefrom00:00otfirstdayofthismonthametric, ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文讨论了Kotlin中扩展函数的一些惯用用法以及其合理性。作者认为在某些情况下,定义扩展函数没有意义,但官方的编码约定支持这种方式。文章还介绍了在类之外定义扩展函数的具体用法,并讨论了避免使用扩展函数的边缘情况。作者提出了对于扩展函数的合理性的质疑,并给出了自己的反驳。最后,文章强调了在编写Kotlin代码时可以自由地使用扩展函数的重要性。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • linux时间字符串转正常时间 ... [详细]
  • java开发公众号,java自学网公众号
    本文目录一览:1、JAVA微信公众号开发回复消息能回复多条吗?具体怎么代码实现? ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 在package.json中有如下两个对象:husky:{hooks:{pre-commit:lint-staged}},lint-staged:{src** ... [详细]
author-avatar
瞄瞄摩卡李流
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有