实时收集Storm日志到ELK集群

àì夳堔傛蜴生んèń 2022-07-14 01:25 163阅读 0赞

背景

我们的storm实时流计算项目已经上线几个月了,由于各种原因迟迟没有进行监控,每次出现问题都要登录好几台机器,然后使用sed,shell,awk,vi等各种命令来查询原因,效率非常低下,而且有些统计是没法做的,所以很有必要对storm本身相关的日志以及我们运行在storm上面的任务的日志做一个统一的日志收集,分析,查询,统计平台。

技术选型

对于这个选择,其实不用考虑那么多,借用一句名言 Life is short , You need elk ! 关于elk相关的安装这里不再介绍,可参考散仙的博客:http://qindongliang.iteye.com/category/330375

需求分析




































序号 讨论 内容
1 storm需要收集的日志 (1)本身的相关的日志 (2)提交任务的日志
2 日志过滤 排除gc的log和部分不相干业务的log
3 索引如何切分 考虑量不是很大,按每月生成一份索引
4 索引模板定制 默认的动态mapping比较简答,所以我们采用自定义动态索引模板
5 日志的定期删除 使用es官网插件curator管理

核心配置

(1)es的模板定义 注意date类型的动态类型是开启docvalue的,便于快速聚合和排序

  1. {
  2. "order": 0,
  3. "template": "jstorm*",
  4. "settings": {
  5. "index": {
  6. "number_of_replicas": "0",
  7. "number_of_shards": "3"
  8. }
  9. },
  10. "mappings": {
  11. "_default_": {
  12. "dynamic_templates": [
  13. {
  14. "level": {
  15. "mapping": { "index": "not_analyzed", "type": "string" },
  16. "match": "level",
  17. "match_mapping_type": "string" }
  18. },
  19. {
  20. "message": {
  21. "mapping": { "index": "analyzed", "type": "string" },
  22. "match": "message",
  23. "match_mapping_type": "string" }
  24. },
  25. {
  26. "date_fields": {
  27. "mapping": { "doc_values": true, "type": "date" },
  28. "match_mapping_type": "date" }
  29. },
  30. {
  31. "string_fields": {
  32. "mapping": { "index": "not_analyzed", "type": "string" },
  33. "match": "*",
  34. "match_mapping_type": "string" }
  35. }
  36. ],
  37. "_all": {
  38. "enabled": false
  39. }
  40. }
  41. },
  42. "aliases": {}
  43. }

(2)logstash的conf定义

  1. input{
  2. file{
  3. #初始化全量导入
  4. start_position => "beginning"
  5. #统一的storm的日志目录
  6. path=> ["/data/logs/jstorm/**/*.log"]
  7. #排除的路径
  8. exclude =>["*gc*","*log_monitor*"]
  9. #指定文件偏移量存储的文件
  10. sincedb_path => "./sincedb"
  11. #配置多行数据收集(针对异常)
  12. codec => multiline {
  13. #类似两个info之间的所有数据是一行数据
  14. pattern => "^\[%{LOGLEVEL:loglevel}"
  15. #true代表是两个loglevel之间的数据
  16. #false代表两个异常之间的数据,跟上面的相反
  17. negate=> true
  18. #后一条的数据前面所有的,都属于这整条数据
  19. what => "previous"
  20. }
  21. }
  22. }
  23. filter {
  24. #使用gork直接获取日志级别和时间
  25. grok {
  26. match =>{
  27. "message"=>"%{LOGLEVEL:loglevel}\s*%{TIMESTAMP_ISO8601:time} "}
  28. }
  29. # 转化日志时间为收集的时间,并移除无用的字段
  30. date{
  31. match => ["time","yyyy-MM-dd HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss","ISO8601"]
  32. remove_field => [ "time","@version" ]
  33. }
  34. # 这个地方可以对一些数据做过滤
  35. # if [loglevel] == "DEBUG" {
  36. # drop { }
  37. # }
  38. }
  39. #输出到es的配置
  40. output{
  41. elasticsearch{
  42. #设置索引名
  43. index => "jstorm_pro%{+YYYY-MM}"
  44. hosts=> ["192.168.8.5:9200","192.168.8.6:9200","192.168.8.7:9200"]
  45. #关闭logstash自动管理模块
  46. manage_template => false
  47. #指定模板名为jstrom
  48. template_name => "jstorm"
  49. #设置flush的数量
  50. flush_size => 3000
  51. }
  52. # 调试控制台输出
  53. # stdout { codec => rubydebug }
  54. }

辅助脚本

放在logstash的根目录下面

  1. 启动脚本:start_jstorm.sh
  2. nohup bin/logstash -f config/jstorm.conf &> jstorm_logstash.log & echo $! >jstorm_logstash_pid&
  3. 关闭脚本:stop_jstorm.sh
  4. kill -9 `cat jstorm_logstash_pid`

收集检索效果

一切完成后,启动logstash收集进程后,我们就可以实时在kibana里面分析数据了,非常nice!

Center

然后,我们就可以非常快速的定位异常数据了。

有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。

3214000f-5633-3c17-a3d7-83ebda9aebff.jpg

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读