前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用FileBeat收集StarRocks日志

使用FileBeat收集StarRocks日志

原创
作者头像
用户6404053
修改2023-04-29 00:53:08
7490
修改2023-04-29 00:53:08
举报
文章被收录于专栏:CatororyCatorory

背景

生产环境中使用StarRocks一般都是多节点,3个fe3个be已经是很小的规模了,出现问题需要查日志的话,6个节点上找日志是比较费劲的,我们希望能够将日志都收集到es,查找方便而且支持搜索,提升排查问题的效率。

日志类型

我们知道StarRocks集群有两种节点类型,fe和be,对应有fe.log和be.log,细分其实还有warn、info、error日志,但是warn和error比较少,这里合并到一起收集。另外,StarRocks是个数据库,所以sql日志也非常重要。所以我们有三种日志需要收集,

fe.log、be.info、audit.log

相关组件

ELK + Kafka

日志收集比较流行的解决方案是ELK,但是logstash功能越来越多导致资源占用比较大,在性能要求比较高的场景中使用不太合适,这里使用更轻量的Filebeat来做收集。Filebeat的数据可以直接发给logstash,公司logstash是运维维护,不太方便直接把日志丢过去,就走kafka中转一下。同时es里一般只保留最近几天的数据,如果希望日志能保留的时间长一些,kafka直接对接到数仓也比较方便。

日志处理

Filebeat配置

我们使用的阿里的E-mapreduce,sr日志目录如下

代码语言:javascript
复制
filebeat.inputs:
- type: log
  id: ali-starrocks02-be02
  enabled: true
  symlinks: true
  paths:
    - /opt/apps/STARROCKS/starrocks-current/be/log/be.INFO
  multiline.pattern: '^I(\d{4}) (\d{2}):(\d{2}):(\d{2}).(\d{6})'
  multiline.negate: true
  multiline.match: after
  fields:
    logtype: belog
processors:
  - add_host_metadata:
  - drop_fields:
      fields: ["log","agent","ecs","input","@metadata"]
      ignore_missing: false
output.kafka:
  enabled: true
  hosts: ["xxx.xxx.xxx.xxx:9092","xxx.xxx.xxx.xxx:9092","xxx.xxx.xxx.xxx:9092"]
  topic: 'starrocks_be_source_log'
  partition.round_robin:
    reachable_only: false
  required_acks: 1
  compression: gzip
  max_message_bytes: 1000000

audit原始日志

代码语言:javascript
复制
{
        "@timestamp": "2023-05-01T05:45:01.345Z",
        "@metadata": {
                "beat": "filebeat",
                "type": "_doc",
                "version": "8.5.0"
        },
        "fields": {
                "logtype": "sqllog"
        },
        "host": {
                "os": {
                        "name": "CentOS Linux",
                        "kernel": "3.10.0-957.21.3.el7.x86_64",
                        "codename": "Core",
                        "type": "linux",
                        "platform": "centos",
                        "version": "7 (Core)",
                        "family": "redhat"
                },
                "name": "sr01",
                "id": "363114529432776998",
                "containerized": false,
                "ip": ["10.0.0.1"],
                "mac": ["CE-16-AF-DS-21-7E"],
                "hostname": "sr01",
                "architecture": "x86_64"
        },
        "message": "2023-05-01 13:45:01,345 [query] |Client=10.0.0.84:40624|User=default_cluster:test|Db=default_cluster:sr_test|State=OK|Time=51|ScanBytes=0|ScanRows=0|ReturnRows=0|StmtId=770|QueryId=a04c6e49-7481-6frw-9409-12854e0e118e|IsQuery=false|feIp=10.0.0.123|Stmt=select 1"
}

处理之后

代码语言:javascript
复制
{
        "@timestamp": "2023-05-01T05:45:01.345Z",
        "logtype": "sqllog",
        "message": "2023-05-01 13:45:01,345 [query] |Client=10.0.0.84:40624|User=default_cluster:test|Db=default_cluster:sr_test|State=OK|Time=51|ScanBytes=0|ScanRows=0|ReturnRows=0|StmtId=770|QueryId=a04c6e49-7481-6frw-9409-12854e0e118e|IsQuery=false|feIp=10.0.0.123|Stmt=select 1",
        "hostname": "sr-01",
        "ip": "10.0.0.1"
}

audit日志比较复杂,处理成上面的格式之后,其实想分析sql日志,还需要对message再做处理,把message字段拆分成kv结构,方法很多,这里就不说细节了。

logstash配置

之前说过收集好的日志需要经过logstash再写到es,那logstash的处理规则是什么样的

fe日志logstash处理规则,fe上有两种日志,但是我们只安装了一个Filebeat,所以收集的时候日志加了hostname、ip和日志类型

代码语言:javascript
复制
filter {
mutate {
        add_field => {"hostname" => "%{[host][name]}"
                      "ip" => "%{[host][ip][0]}"
                      "logtype" => "%{[fields][logtype]}"}
    remove_field => ["tags", "beats_input_codec_plain_applied", "@version","host","fields"]
  }
}
output {
    if [logtype] == "sqllog" {
      kafka {
        codec => json
        bootstrap_servers => "xxx.xxx.xxx.xxx:9092"
        topic_id => "starrocks_audit_log"
      }
 }  else  {
     elasticsearch {
        hosts => "hostname"
        data_stream => "true"
    }
    }  
}

be配置

代码语言:javascript
复制
filter {
mutate {
        add_field => {"hostname" => "%{[host][name]}"
                      "ip" => "%{[host][ip][0]}"
                      "logtype" => "%{[fields][logtype]}"}
    remove_field => ["tags", "beats_input_codec_plain_applied", "@version","host","fields"]
  }
}
output {
     elasticsearch {
        hosts => "hostname"
        data_stream => "true"
    }
 }  

遇到过的问题

1.Filebeat多行日志合并

Filebeat默认收集日志是一行一条,如果一条日志打成了多行,收集的时候就会拆开,多行sql和java的异常日志都会有这种问题,multiline插件可以通过正则匹配日志开头,然后配合其他参数合并多行日志

2.Filebeat(8.x)不支持输出到多个output

sr机器上有多重日志(audit、fe.info、warn),audit日志是kv结构,和其他日志的处理方式不同,

需要走不同的处理流程,但是不支持多输出就只能在下游去处理(比如logstash)

3.Filebeat采集符号链接默认是false

需要手动配置symlinks为true,不然日志输出配置为软连接的日志收集不到

4.BE日志时间格式不标准

默认的be日志开头并不是一个标准的时间格式(2023-05-01 12:03:42)是自定义的格式(I0501 06:43:13.84650),收集时需要修改对应的正则

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 日志类型
  • 相关组件
  • 日志处理
    • audit原始日志
      • logstash配置
      • 遇到过的问题
      相关产品与服务
      Elasticsearch Service
      腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档