实时收集Storm日志到ELK集群

我会带着你远行 2022-04-11 09:08 248阅读 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": {
  16. "index": "not_analyzed",
  17. "type": "string"
  18. },
  19. "match": "level",
  20. "match_mapping_type": "string"
  21. }
  22. },
  23. {
  24. "message": {
  25. "mapping": {
  26. "index": "analyzed",
  27. "type": "string"
  28. },
  29. "match": "message",
  30. "match_mapping_type": "string"
  31. }
  32. },
  33. {
  34. "date_fields": {
  35. "mapping": {
  36. "doc_values": true,
  37. "type": "date"
  38. },
  39. "match_mapping_type": "date"
  40. }
  41. },
  42. {
  43. "string_fields": {
  44. "mapping": {
  45. "index": "not_analyzed",
  46. "type": "string"
  47. },
  48. "match": "*",
  49. "match_mapping_type": "string"
  50. }
  51. }
  52. ],
  53. "_all": {
  54. "enabled": false
  55. }
  56. }
  57. },
  58. "aliases": {}
  59. }

(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 =>{"message"=>"%{LOGLEVEL:loglevel}\s*%{TIMESTAMP_ISO8601:time} "}
  27. }
  28. # 转化日志时间为收集的时间,并移除无用的字段
  29. date{
  30. match => ["time","yyyy-MM-dd HH:mm:ss.SSS","yyyy-MM-dd HH:mm:ss","ISO8601"]
  31. remove_field => [ "time","@version" ]
  32. }
  33. # 这个地方可以对一些数据做过滤
  34. # if [loglevel] == "DEBUG" {
  35. # drop { }
  36. # }
  37. }
  38. #输出到es的配置
  39. output{
  40. elasticsearch{
  41. #设置索引名
  42. index => "jstorm_pro%{+YYYY-MM}"
  43. hosts=> ["192.168.8.5:9200","192.168.8.6:9200","192.168.8.7:9200"]
  44. #关闭logstash自动管理模块
  45. manage_template => false
  46. #指定模板名为jstrom
  47. template_name => "jstorm"
  48. #设置flush的数量
  49. flush_size => 3000
  50. }
  51. # 调试控制台输出
  52. # stdout { codec => rubydebug }
  53. }

#### 辅助脚本
放在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!
[img]http://note.youdao.com/yws/public/resource/344cd03f173c19ea03136b36d01a5f91/xmlnote/7481853568384AADAE4A3FD7308FFBDB/25321\[/img\]

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

[b][color=green][size=large]
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
[/size][/color][/b]
[img]http://dl2.iteye.com/upload/attachment/0104/9948/3214000f-5633-3c17-a3d7-83ebda9aebff.jpg\[/img\]

发表评论

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

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

相关阅读