日志收集笔记(Filebeat 日志收集、Logstash 日志过滤)

1 FileBeat

Filebeat 是使用 Golang 实现的轻量型日志采集器,也是 Elasticsearch stack 里面的一员。本质上是一个 agent ,可以安装在各个节点上,根据配置读取对应位置的日志,并上报到相应的地方去。

1.1 FileBeat 安装与使用

官网 下载对应的版本,我这里的 ElasticSearch 版本号是 6.4.3,所以下载 FileBeat 的版本也是 6.4.3
下载后解压:

cd /home/software
tar -zxvf filebeat-6.4.3-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local
mv filebeat-6.4.3-linux-x86_64/ filebeat-6.4.3

配置 Filebeat,可以参考 filebeat.full.yml 中的配置

vim /usr/local/filebeat-6.4.3/filebeat.yml

内容如下:

###################### Filebeat Configuration Example #########################
filebeat.prospectors:

- input_type: log

  paths:
    ## 定义了日志文件路径,可以采用模糊匹配模式,如*.log
    - /workspaces/logs/logCollector/app-collector.log
  #定义写入 ES 时的 _type 值
  document_type: "app-log"
  multiline:
    #pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'   # 指定匹配的表达式(匹配以 2017-11-15 08:04:23:889 时间格式开头的字符串)
    pattern: '^\['                              # 指定匹配的表达式(匹配以 [ 开头的字符串)
    negate: true                                # 是否需要匹配到
    match: after                                # 不匹配的行,合并到上一行的末尾
    max_lines: 2000                             # 最大的行数
    timeout: 2s                                 # 如果在规定时间没有新的日志事件就不等待后面的日志
  fields: ## topic 对应的消息字段或自定义增加的字段
    logbiz: collector
    logtopic: app-log-collector   ## 按服务划分用作kafka topic,会在logstash filter 过滤数据时候作为 判断参数 [fields][logtopic]
    evn: dev

- input_type: log

  paths:
    ## 定义了日志文件路径,可以采用模糊匹配模式,如*.log
    - /workspaces/logs/logCollector/error-collector.log
  #定义写入 ES 时的 _type 值
  document_type: "error-log"
  multiline:
    #pattern: '^\s*(\d{4}|\d{2})\-(\d{2}|[a-zA-Z]{3})\-(\d{2}|\d{4})'   # 指定匹配的表达式(匹配以 2017-11-15 08:04:23:889 时间格式开头的字符串)
    pattern: '^\['                              # 指定匹配的表达式(匹配以 [ 开头的字符串)
    negate: true                                # 是否匹配到
    match: after                                # 不匹配的行,合并到上一行的末尾
    max_lines: 2000                             # 最大的行数
    timeout: 2s                                 # 如果在规定时间没有新的日志事件就不等待后面的日志,直接进行推送操作
  fields: ## topic 对应的消息字段或自定义增加的字段
    logbiz: collector
    logtopic: error-log-collector   ## 按服务划分用作kafka topic
    evn: dev

output.kafka: ## filebeat 支持多种输出,支持向 kafka,logstash,elasticsearch 输出数据,此处设置数据输出到 kafka。
  enabled: true ## 启动这个模块
  hosts: ["192.168.212.128:9092"] ## 地址
  topic: '%{[fields.logtopic]}'  ## 主题(使用动态变量)
  partition.hash:  ## kafka 分区 hash 规则
    reachable_only: true
  compression: gzip  ## 数据压缩
  max_message_bytes: 1000000  ## 最大容量
  required_acks: 1  ## 是否需要 ack
logging.to_files: true

检查配置是否正确:

./filebeat -c filebeat.yml -configtest

启动filebeat:

/usr/local/filebeat-6.4.3/filebeat &

注:需要启动 kafka

2 Logstash 日志过滤

《Elasticsearch入门笔记(Logstash数据同步)》 这边文章中已经介绍过任何安装配置 Logstash 了,不过那时输入的数据源是来自于 MySQL,此时输入的数据源是 Kafka。
/usr/local/logstash-6.4.3 目录下新建一个 script 用于存放对接 Kafka 的配置文件。
以下是该目录下创建的 logstash-script.conf 文件:

## multiline 插件也可以用于其他类似的堆栈式信息,比如 linux 的内核日志。
input {
  kafka {
    topics_pattern => "app-log-.*"  ## kafka 主题 topic
    bootstrap_servers => "192.168.212.128:9092"  ## kafka 地址
    codec => json  ## 数据格式
    consumer_threads => 1  ## 增加consumer的并行消费线程数(数值可以设置为 kafka 的分片数)
    decorate_events => true
    group_id => "app-log-group" ## kafka 组别
  }
  kafka {
    topics_pattern => "error-log-.*"  ## kafka 主题 topic
    bootstrap_servers => "192.168.212.128:9092" ## kafka 地址
    codec => json  ## 数据格式
    consumer_threads => 1  ## 增加consumer的并行消费线程数(数值可以设置为 kafka 的分片数)
    decorate_events => true
    group_id => "error-log-group" ## kafka 组别
  }
}
 
filter {
  ## 时区转换,这里使用 ruby 语言,因为 logstash 本身是东八区的,这个时区比北京时间慢8小时,所以这里采用 ruby 语言设置为北京时区
  ruby {
    code => "event.set('index_time',event.timestamp.time.localtime.strftime('%Y.%m.%d'))"
  }

  ## [fields][logtopic] 这个是从 FileBeat 定义传入 Kafka 的
  if "app-log" in [fields][logtopic]{
    grok {
      ## 表达式,这里对应的是Springboot输出的日志格式
      match => ["message", "\[%{NOTSPACE:currentDateTime}\] \[%{NOTSPACE:level}\] \[%{NOTSPACE:thread-id}\] \[%{NOTSPACE:class}\] \[%{DATA:hostName}\] \[%{DATA:ip}\] \[%{DATA:applicationName}\] \[%{DATA:location}\] \[%{DATA:messageInfo}\] ## (\'\'|%{QUOTEDSTRING:throwable})"]
    }
  }
 
  ## [fields][logtopic] 这个是从 FileBeat 定义传入 Kafka 的
  if "error-log" in [fields][logtopic]{
    grok {
      ## 表达式
      match => ["message", "\[%{NOTSPACE:currentDateTime}\] \[%{NOTSPACE:level}\] \[%{NOTSPACE:thread-id}\] \[%{NOTSPACE:class}\] \[%{DATA:hostName}\] \[%{DATA:ip}\] \[%{DATA:applicationName}\] \[%{DATA:location}\] \[%{DATA:messageInfo}\] ## (\'\'|%{QUOTEDSTRING:throwable})"]
    }
  }
}
 
## 测试输出到控制台:
## 命令行输入 ./logstash -f /usr/local/logstash-6.4.3/script/logstash-script.conf  --verbose --debug
output {
  stdout { codec => rubydebug }
}
 
 
## elasticsearch:
output {
 
  if "app-log" in [fields][logtopic]{
    ## es插件
    elasticsearch {
      # es服务地址
      hosts => ["192.168.212.128:9200"]
      ## 索引名,%{index_time} 是由上面配置的 ruby 脚本定义的日期时间,即每天生成一个索引
      index => "app-log-%{[fields][logbiz]}-%{index_time}"
      # 是否嗅探集群ip:一般设置true
      # 只需要知道一台 elasticsearch 的地址,就可以访问这一台对应的整个 elasticsearch 集群
      sniffing => true
      # logstash默认自带一个mapping模板,进行模板覆盖
      template_overwrite => true
    }
  }
  
  if "error-log" in [fields][logtopic]{
    elasticsearch {
      hosts => ["192.168.212.128:9200"]
      index => "error-log-%{[fields][logbiz]}-%{index_time}"
      sniffing => true
      template_overwrite => true
    } 
  }
}

查看一下其中的过滤规则,这需要结合 《日志收集笔记(架构设计、Log4j2项目初始化、Lombok)》 文章中的定义日志输出格式一起看:

["message", "\[%{NOTSPACE:currentDateTime}\] \[%{NOTSPACE:level}\] \[%{NOTSPACE:thread-id}\] \[%{NOTSPACE:class}\] \[%{DATA:hostName}\] \[%{DATA:ip}\] \[%{DATA:applicationName}\] \[%{DATA:location}\] \[%{DATA:messageInfo}\] ## (\'\'|%{QUOTEDSTRING:throwable})"]
  • "message":logstash 固定的格式,统一叫传入的数据为 message
  • \[%{NOTSPACE:currentDateTime}\]:匹配 [ 为开头,] 为结尾,NOTSPACE 表示不能有空格,赋值变量名为 currentDateTime
  • \[%{NOTSPACE:level}\]:匹配 [ 为开头,] 为结尾,NOTSPACE 表示不能有空格,赋值变量名为 level,日志级别
  • \[%{NOTSPACE:thread-id}\]:匹配 [ 为开头,] 为结尾,NOTSPACE 表示不能有空格,赋值变量名为 thread-id,线程ID
  • \[%{NOTSPACE:class}\]:匹配 [ 为开头,] 为结尾,NOTSPACE 表示不能有空格,赋值变量名为 class,创建对应 logger 实例传入的 class
  • \[%{DATA:hostName}\]:匹配 [ 为开头,] 为结尾,DATA 表示数据,可为空,赋值变量名为 level,当前应用主机名称
  • \[%{DATA:ip}\]:匹配 [ 为开头,] 为结尾,DATA 表示数据,可为空,赋值变量名为 level,当前应用的 IP
  • \[%{DATA:applicationName}\]:匹配 [ 为开头,] 为结尾,DATA 表示数据,可为空,赋值变量名为 level,当前应用的 applicationName
  • \[%{DATA:location}\]:匹配 [ 为开头,] 为结尾,DATA 表示数据,可为空,赋值变量名为 location
  • \[%{DATA:messageInfo}\]:匹配 [ 为开头,] 为结尾,DATA 表示数据,可为空,赋值变量名为 messageInfo,日志输出的自定义内容
  • (\'\'|%{QUOTEDSTRING:throwable}):两个 ' 单引号之间的 | 表示,之间可为空,不为空就是 throwable 异常信息

启动 logstash:

/usr/local/logstash-6.4.3/bin/logstash -f /usr/local/logstash-6.4.3/script/logstash-script.conf
## 如果测试时,想要控制台输出日志,输入以下命令
/usr/local/logstash-6.4.3/bin/logstash -f /usr/local/logstash-6.4.3/script/logstash-script.conf --verbose --debug
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
filebeatlogstash都是日志收集工具,它们之间的主要差异在于功能和资源占用。filebeat更轻量,占用的资源较少,用于采集日志并将其发送到消息队列,如Redis或Kafka。而logstash具有过滤功能,可以对采集到的日志进行过滤和分析,并将结果存储到Elasticsearch中。 具体而言,filebeat负责收集日志并将其转发给logstashlogstash使用filter功能对日志进行过滤整理成JSON格式,然后再转发给Socket服务器来处理业务逻辑。 总的来说,logstash是一个功能更为强大的日志收集工具,具有丰富的插件和配置选项,可以用于更复杂的日志收集和处理场景。而filebeat则更加轻量和简单,适用于一般的日志采集需求。 因此,如果你需要对日志进行过滤和分析的功能,可以选择使用logstash。而如果你只需要简单地采集日志并将其发送到其他地方进行处理,可以使用filebeat。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [logstashfilebeat 关系](https://blog.csdn.net/w892824196/article/details/112766412)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [日志检测-filebeat+logstash-整理.docx](https://download.csdn.net/download/huipeng3321/11422758)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值