filebeat + logstash使用笔记

背景

本文中有2台主机:

(1)1.1.1.1是OpenStack的nova节点,安装filebeat

(2)1.1.1.2是logstash节点

在1.1.1.1上通过filebeat读取OpenStack的nova-compute组件日志(/var/log/nova/nova-compute.log)的增量日志送至logstash,处理后送至下一步环节(终端输出、写入文件、kafka、elasticsearch)。

nova-compute日志格式示例如下:

2023-05-10 23:21:53.513 7 INFO nova.virt.driver [req-59da3b8b-04ed-446d-8d3e-838d3918bdc8 - - - - -] Loading compute driver 'libvirt.LibvirtDriver'

日志格式为"日期 时间 进程id(网上未查到信息) 日志等级 代码模块 请求id 日志正文"。

filebeat

安装

本文从官网(https://www.elastic.co/cn/downloads/beats/filebeat)下载rpm包并安装。

rpm -ivh filebeat-8.13.0-x86_64.rpm

配置

修改/etc/filebeat/filebeat.yml如下:

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nova/nova-compute.log
  start_position: end
  multiline.pattern: '^\d{4}-\d{2}-\d{2}\s'
  multiline.negate: true
  multiline.match: after
  fields:
    hostip: 1.1.1.1
    service: nova
    component: nova-compute
  fields_under_root: true
output.console:
  pretty: true
  enable: true
output.logstash:
  hosts: ["1.1.1.2:5000"]

其中部分配置解释如下:

(1)start_position
start_position: end表示从末尾开始读取,则文件中原有的历史日志都会被忽略。

(2)multiline

multiline.pattern: '^\d{4}-\d{2}-\d{2}\s'
multiline.negate: true
multiline.match: after

针对日志正文可能出现的换行符情况,对不匹配^\d{4}-\d{2}-\d{2}\s正则表达式的行,追加至上一行后面。

(3)fields

通过fields新增三个字段hostip、service、component

(4)fields_under_root

将新增的三个字段hostip、service、component放置于json的顶层字段

(5)output.console

结果通过终端输出,注意如果使用systemcctl命令后台运行则不会输出,此配置只有前台运行才会生效

(6)output.logstash

输出至logstash

运行

用如下命令测试:

filebeat -e -c /etc/filebeat/filebeat.yml

由于配置中有output.console,通过终端输出示例如下:

{
  "@timestamp": "2024-07-31T13:35:24.159Z",
  "@metadata": {
    "beat": "filebeat",
    "type": "_doc",
    "version": "8.13.0"
  },
  "agent": {
    "name": "host",
    "type": "filebeat",
    "version": "8.13.0",
    "ephemeral_id": "e8367621-cd9a-4fc2-ad71-be60f93976d5",
    "id": "0fef92e2-5af8-4706-ba2d-6f3cd1416f40"
  },
  "log": {
    "file": {
      "path": "/var/log/nova/nova-compute.log"
    },
    "offset": 1067
  },
  "message": "2023-05-10 23:21:52.593 7 INFO os_vif [-] Loaded VIF plugins: linux_bridge, noop, ovs",
  "input": {
    "type": "log"
  },
  "service": "nova",
  "ecs": {
    "version": "8.0.0"
  },
  "host": {
    "name": "host"
  },
  "component": "nova-compute",
  "hostip": "1.1.1.1"
}

配置文件测试无误后,可以使用systemctl start filebeat后台运行。

logstash

安装

官网(https://www.elastic.co/cn/downloads/logstash)下载rpm包并安装。

rpm -ivh logstash-8.14.1-x86_64.rpm

配置

logstash的配置文件目录为/etc/logstash/conf.d,logstsh会读取目录下的所有配置文件,从而可以分别启用不同的端口、进行不同的处理和输出。但是logstsh只会简单的将所有配置拼凑起来,从而导致结果混乱,本文中通过type字段进行区分。

新建openstack.conf如下:

input {
  beats {
    port => 5000 
    type => "openstack"
  } 
}
filter {
  if [type] == "openstack" {
    mutate {
      add_field => [ "[resource_pool]", "KVM01" ]
      gsub => ["message", "\n", " "]
    }
    grok {
      match => ["message", "(?<log_time>^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) %{INT:pid} %{LOGLEVEL:log_level} %{GREEDYDATA:module} (?<request_id>\[(\s|\S)+\]) %{GREEDYDATA:log_message}"]
    }
  }
}
output {
  if [type] == "openstack" {
    stdout { codec => rubydebug }
    file {
      path => "/var/log/openstack-log.log"
      codec => line {
        format => "%{resource_pool} %{[host][name]} %{hostip} %{service} %{component} %{log_time} %{log_level} %{module} %{request_id} %{log_message}"
      }
}
      gzip => false
    }
    kafka {
      bootstrap_servers => "2.2.2.2:8333,2.2.2.3:8333,2.2.2.4:8333"
      security_protocol => "SASL_PLAINTEXT"
      sasl_mechanism => "SCRAM-SHA-512"
      sasl_jaas_config => "org.apache.kafka.common.security.scram.ScramLoginModule required username='xxxxxxx' password='xxxxxxxxxxx';"
      topic_id => "OPENSTACK-LOG"
      codec => json {
        charset => "UTF-8" 
      }
    }
    elasticsearch {
      hosts => ["1.1.1.3:9200"]
    }
  }
}

其中部分配置解释如下:

(1)input

启动5000端口接受filebeat信息,并在接收的每一条消息中增加type字段

(2)filter
mutate

add_field:增加字段

gsub:将message字段中的换行符替换为空
grok

将message拆分:

匹配^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d{3}的部分作为 log_time字段

数字作为pid字段

LOGLEVEL类型字符串作为log-level字段

GREEDYDATA类型字符串作为module}字段

匹配[(\s|\S)+]的部分作为request-id

剩余的GREEDYDATA类型作为log-message字段

(3)output

本文中演示了stdout、file、kafka、elasticsearch四种对接方法

启动

用以下命令进行测试:

/usr/share/logstash/bin/logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/openstack.conf --config.test_and_exit

配置文件测试无误后,可以使用systemctl start logstash后台运行。

相关推荐
衣舞晨风5 天前
Logstash 迁移索引元数据(设置和映射)
运维·elasticsearch·同步·logstash·index·setting
CNAHYZ10 天前
Elastic Stack - FileBeat 入门浅体验
java·大数据·elasticsearch·es·filebeat
小韩加油呀14 天前
filebeat收集日志直接输出到elasticsearch
elasticsearch·filebeat
极客先躯14 天前
分布式日志有哪些?
kafka·fluentd·logstash·filebeat·1024程序员节·分布式日志·elk stack
萧曵 丶1 个月前
docker 部署 filebeat 采集日志导入到elasticsearch 设置pipeline
elasticsearch·docker·jenkins·filebeat
闲人编程2 个月前
Python实现日志采集功能
开发语言·python·fluentd·filebeat·日志采集
龙门吹雪2 个月前
Docker 安装FileBeat、Elasticsearch及Kibana详细步骤
elasticsearch·docker·kibana·filebeat·日志监控平台
zheshijiuyue3 个月前
ELK 日志分析系统
elk·elasticsearch·kibana·logstash