ELK之logstash

本文介绍了使用ELK栈(Elasticsearch, Logstash, Kibana)进行日志监控的方法,通过部署Filebeat收集日志,Logstash进行处理并报警,最终存储于Elasticsearch以供Kibana展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ELK之logstash

最近在工作中发现一些服务 不是经常使用,所以当出现内存溢出的时候无法实时感知到,所以我这边使用了logstash,之前有考虑过zabbix但是zabbix日志监控实施起来比较麻烦 并且日志查看起来非常麻烦,最后发现logstash有日志监控的功能并且可以将日志保存在Elasticsearch中并且可以在Kibana中显示出来。接下来我将下具体实现:

首先我搭建的是Elasticsearch+logstash+Kibana+filebeat   elk的搭建我就不讲了 之前的文章已经介绍过了。Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并且转发这些信息到elasticsearch或者logstarsh中存放。并且filebeat不需要配置正则表达式就可以达到很好的效果。当然有些人会在Filebeat和Elasticsearch加一层redis,但是日志量不是很大,完全没必要加,如果怕Elasticsearch宕机导致一部分日志没有收集到可以考虑加redis

我目前所设计的架构是:

images

安装filebeat的话非常简单:

rpm:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.1.1-x86_64.rpm

sudo rpm -vi filebeat-5.1.1-x86_64.rpm

接下来就是配置了:

配置文件是/etc/filebeat/filebeat.yml这个文件

images

 

paths:对应的是日志收集的文件目录

document_type:是设置该文件的自定义类型(在设置logstash的时候会用到)

output部分是将日志实时输出到logstash中进行处理

hosts:设置logstash的IP地址以及暴露的端口号

其余的默认就可以了

设置好之后我们就可以去logstash中进行设置了

在logstash中对应几个文件如下

images

logstash-stdin.conf对应的是日志输入的时候进行处理也就是input部分

logstash-output-online-java.conf和logstash-output-pre-java.conf是output部分

logstash-filter-pre-java.conf是filter部分

这三个之前我是现在一个文件因为当时没有考虑大大量配置,如果有大量配置的话如果放在一个文件不利于维护

首先看下logstash-stdin.conf的内容

images

input部分直接是用filebeat的模块指定输入时的端口号以及字符格式类型

ports部分指定的是输入到logstash的端口好也就是logstash服务

logstash-filter-pre-java.conf是过滤部分,考虑到日志量比较大,并且有些日志只是一些dubbo的信息,所以我和dev讨论是否可以直接过滤掉 这样会有便于查找问题

images

目前就过滤掉这些字符当然filter中还可以设置很多东西 这里就不讲了

接下来是output的部分是最关键的部分,当我们从input收集到日志的时候并且处理完成之后 我们需要把这些日志放到Elasticsearch中

并且当出现”java.lang.OutOfMemoryError”关键字的时候 第一时间发送邮件报警

images

其中关心的是hosts指定的是Elasticsearch服务地址和端口号

index是索引的名字,我这里按照日期将他们按天分开

if下面的是判断语句当内存溢出的关键字出现在messages的时候我将发送报警邮件

to是指发送给谁

from指的是从那里发送过来

address指的是smtp的地址

username和password我就不说了

下面的分别是标题和内容

实现效果见:

images

<think>嗯,用户之前问了关于Redis哨兵的配置,现在转向了ELK中的Logstash配置。首先,我需要确认用户对ELK的整体了解程度。ELK是Elasticsearch、Logstash和Kibana的简称,用于日志管理和分析。用户可能已经知道这一点,但需要详细讲解Logstash的配置。 用户可能在使用Logstash时遇到了问题,或者想优化现有的配置。考虑到他们之前的问题是关于配置的,这次可能想了解如何正确设置Logstash的配置文件,各个部分的作用,以及常见问题的解决方法。另外,用户可能需要具体的配置示例和最佳实践。 Logstash的配置包括输入、过滤和输出三个部分。输入部分负责数据来源,比如文件、Beats、Kafka等。过滤部分使用插件如Grok来解析和转换数据,输出则发送到Elasticsearch或其他存储。需要详细解释每个部分的配置语法和常用插件。 用户可能对Grok模式不太熟悉,这部分需要举例说明,比如如何解析常见的日志格式。此外,性能优化也是关键,比如调整工作线程、批量处理设置,以及如何处理高负载情况下的性能问题。 还要考虑用户的实际应用场景,比如他们是否处理的是Web服务器日志、应用日志,或是数据库日志。不同的日志类型可能需要不同的过滤策略。同时,用户可能关心错误处理和监控,比如如何处理解析失败的数据,如何监控Logstash的运行状态。 需要提供配置示例,展示一个完整的配置文件结构,并分步骤解释每个配置项的作用。此外,常见问题如性能瓶颈、日志解析错误、资源占用过高等,应该给出解决方案和建议。 最后,要确保回答结构清晰,分点说明,方便用户逐步理解和应用。可能还需要比较Logstash与其他工具(如Filebeat)的适用场景,帮助用户做出更适合的选择。</think>--- ### **ELKLogstash 配置详解:数据管道的核心引擎** **Logstash** 是 ELK 技术栈(Elasticsearch + Logstash + Kibana)中的 **数据处理管道**,负责从多种来源采集、解析、转换数据,并输出到目标存储(如 Elasticsearch)。其核心价值在于 **统一数据格式** 和 **灵活的数据清洗能力**。 --- #### **一、Logstash 核心架构** Logstash 配置基于 **插件化管道**,由三阶段构成: ```text Input(输入) → Filter(过滤) → Output(输出) ``` | **阶段** | **功能** | **常用插件** | **典型场景** | | --- | --- | --- | --- | | **Input** | 数据采集 | `file`, `beats`, `kafka`, `jdbc` | 读取日志文件、接收 Beats 数据流 | | **Filter** | 数据清洗 | `grok`, `mutate`, `date`, `json` | 解析日志格式、转换字段类型 | | **Output** | 数据输出 | `elasticsearch`, `stdout`, `kafka` | 写入 Elasticsearch 或调试输出 | --- #### **二、Logstash 配置文件结构** 创建一个 `.conf` 文件(如 `logstash-sample.conf`),基本结构如下: ```ruby input { # 输入插件配置(例如从文件读取日志) file { path => "/var/log/nginx/access.log" start_position => "beginning" sincedb_path => "/dev/null" # 禁用 sincedb(测试时使用) } } filter { # 使用 Grok 解析 Nginx 访问日志 grok { match => { "message" => "%{COMBINEDAPACHELOG}" } } # 转换字段类型(如将响应时间转为浮点数) mutate { convert => { "response" => "float" } } # 解析时间戳并替换默认 @timestamp date { match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] target => "@timestamp" } } output { # 输出到 Elasticsearch elasticsearch { hosts => ["http://localhost:9200"] index => "nginx-access-%{+YYYY.MM.dd}" } # 调试时输出到控制台 stdout { codec => rubydebug } } ``` --- #### **三、关键配置解析** ##### **1. Input 插件配置示例** - **从文件采集日志**: ```ruby file { path => "/var/log/*.log" # 支持通配符 exclude => "*.gz" # 排除压缩文件 start_position => "end" # 默认从文件末尾读取(避免历史数据重复) } ``` - **接收 Filebeat 数据**: ```ruby beats { port => 5044 ssl => true ssl_certificate => "/path/to/logstash.crt" ssl_key => "/path/to/logstash.key" } ``` ##### **2. Filter 插件核心用法** - **`grok` 解析复杂日志**: ```ruby grok { match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:log_level} %{GREEDYDATA:message}" } # 若匹配失败,添加标签便于排查 tag_on_failure => ["_grokparsefailure"] } ``` - **预定义模式**:如 `%{COMBINEDAPACHELOG}` 可解析标准 Apache/Nginx 日志。 - **自定义模式**:在 `patterns_dir` 目录中创建自定义模式文件。 - **`mutate` 字段操作**: ```ruby mutate { rename => { "old_field" => "new_field" } # 重命名字段 remove_field => ["temp_data"] # 删除无用字段 split => { "tags" => "," } # 按分隔符拆分字段 } ``` - **`date` 时间处理**: ```ruby date { match => [ "log_timestamp", "UNIX_MS" ] # 解析 UNIX 毫秒时间戳 target => "@timestamp" # 覆盖默认时间戳 } ``` ##### **3. Output 插件配置技巧** - **写入 Elasticsearch**: ```ruby elasticsearch { hosts => ["http://es-node1:9200", "http://es-node2:9200"] index => "app-logs-%{+YYYY.MM}" # 按月份滚动索引 document_id => "%{fingerprint}" # 自定义文档 ID(避免重复) retry_on_conflict => 3 # 写入冲突时重试次数 } ``` - **输出到 Kafka**: ```ruby kafka { codec => json topic_id => "processed_logs" bootstrap_servers => "kafka1:9092,kafka2:9092" compression_type => "snappy" # 压缩减少带宽占用 } ``` --- #### **四、性能优化配置** 1. **管道线程与批量处理**: ```ruby pipeline { workers => 4 # 并行工作线程数(建议等于 CPU 核心数) batch_size => 125 # 单次处理事件数 batch_delay => 50 # 批次处理间隔(毫秒) } ``` 2. **内存与队列管理**: ```ruby queue { type => "persisted" # 启用磁盘持久化队列(防止数据丢失) max_bytes => "2gb" # 队列最大容量 } ``` 3. **JVM 调优**: 修改 `config/jvm.options`: ```text -Xms4g # 初始堆内存 -Xmx4g # 最大堆内存(建议不超过物理内存的 50%) ``` --- #### **五、调试与排查技巧** - **输出到控制台**: ```ruby output { stdout { codec => rubydebug # 格式化打印完整事件内容 } } ``` - **使用 `--debug` 模式启动**: ```bash bin/logstash -f logstash.conf --debug ``` - **监控 Logstash 状态**: - 查看 `/usr/share/logstash/logs/logstash-plain.log` - 使用 X-Pack 或 Prometheus 监控指标(如事件处理速率、内存使用) --- #### **六、典型问题解决方案** | **问题现象** | **可能原因** | **解决方案** | | --- | --- | --- | | Grok 解析失败 | 日志格式与模式不匹配 | 使用 [Grok Debugger](https://grokdebug.herokuapp.com/) 在线调试模式 | | 数据未写入 ES | 网络不通或索引权限问题 | 检查 `hosts` 配置,测试 `curl http://es-host:9200` | | CPU 占用过高 | Grok 正则复杂或线程过多 | 优化正则表达式,减少 `workers` 数量 | | 内存溢出 | JVM 堆内存不足 | 调整 `-Xmx` 参数,优化过滤器逻辑 | --- #### **七、最佳实践** 1. **字段规范化**: - 统一字段命名(如 `user_id` 而非 `uid`) - 删除冗余字段(如原始日志行 `message` 可在解析后移除) 2. **动态索引命名**: ```ruby index => "error-logs-%{+YYYY.MM.dd}" # 按天分索引 ``` 3. **多管道配置**: 在 `config/pipelines.yml` 中定义多个独立管道,隔离不同业务日志处理逻辑。 4. **与 Filebeat 分工**: - Filebeat 负责轻量级日志收集与传输 - Logstash 负责复杂数据处理(解析、富化) --- **总结**:Logstash 的配置灵活性是其核心优势,但也需要根据业务需求合理设计输入、过滤、输出链路。通过优化 Grok 模式、调整线程参数和监控资源使用,可显著提升数据处理效率。对于高吞吐场景,建议结合 Kafka 作为缓冲区,避免数据丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值