ELK 之 Logstash

本文深入探讨Logstash的功能与配置,涵盖安装步骤、模块详解及实战应用案例,如Elasticsearch慢查询日志、Mysql慢日志、Nginx访问及错误日志、PHP错误日志和慢日志的解析。

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

ELK 之 Logstash

简介:

ELK 之 LogstashLogstash 是一个接收,处理,转发日志的工具。支持系统日志,webserver 日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。在一个典型的使用场景下(ELK):用 Elasticsearch 作为后台数据的存储,kibana用来前端的报表展示。Logstash 在其过程中担任搬运工的角色,它为数据存储,报表查询和日志解析创建了一个功能强大的管道链。Logstash 提供了多种多样的 input,filters,codecs 和 output 组件,让使用者轻松实现强大的功能。

安装:

(需要 jdk 环境,安装过程这里不再阐述,笔者此处使用 jdk 1.8) 
这里使用 2.4.1 版本,是为了和公司 elasticsearch2.x 配合,版本自行控制。 
注意: ELK 技术栈有 version check,软件大版本号需要一致

yum -y install https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.4.1.noarch.rpm

安装完成后会生成两个主要目录和一个配置文件 
程序主体目录:/opt/logstash 
log 分析配置文件目录:/etc/logstash/conf.d 
程序运行配置文件:/etc/sysconfig/logstash 
先测试是否安装成功

[root@~]#/opt/logstash/bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Settings: Default pipeline workers: 4
Pipeline main started
hello world! # 输入测试字符串
{
"message" => "hello world!",  # 成功输出
"@version" => "1",
"@timestamp" => "2017-08-07T07:47:35.938Z",
"host" => "iZbp13lsytivlvvks4ulatZ"
}

如何执行按指定配置文件执行

/opt/logstash/bin/logstash –w 2 -f /etc/logstash/conf.d/test.conf
  • 1

参数

-w # 指定线程,默认是 cpu 核数 
-f # 指定配置文件 
-t # 测试配置文件是否正常 
-b # 执行 filter 模块之前最大能积累的日志,数值越大性能越好,同时越占内 

配置文件写法:

# 日志导入
input {
}
# 日志筛选匹配处理
filter {
}
# 日志匹配输出
output {
}

日志解析配置文件的框架共分为三个模块,input,output,filter。后面会一一讲解, 每个模块里面存在不同的插件。

input 模块

列子1
input {
    # file为常用文件插件,插件内选项很多,可根据需求自行判断
    file {
        path => "/var/lib/mysql/slow.log"
        # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
        Excude =>”*.gz”
        # 要排除的文件
        start_position => "beginning"
        # 从文件开始的位置开始读,end表示从结尾开始读
        ignore_older => 0  
        # 多久之内没修改过的文件不读取,0为无限制,单位为秒
        sincedb_path => "/dev/null"
        # 记录文件上次读取位置,输出到null表示每次都从文件首行开始解析
        type => "mysql-slow"
        # type字段,可表明导入的日志类型
    }   
}
例子2
input {

    # redis插件为常用插件,插件内选项很多,可根据需求自行判断
    redis {
        batch_count => 1 
        # EVAL命令返回的事件数目,设置为5表示一次请求返回5条日志信息
        data_type => "list" 
        # logstash redis插件工作方式
        key => "logstash-test-list" 
        # 监听的键值
        host => "127.0.0.1" 
        # redis地址
        port => 6379 
        # redis端口号
        password => "123qwe" 
        # 如果有安全认证,此项为认证密码
        db => 0 
        # 如果应用使用了不同的数据库,此为redis数据库的编号,默认为0。
        threads => 1 
        # 启用线程数量
      }
}

常用的 input 插件其实有很多,这里只举例了两种。其他还有 kafka,tcp 等等

filter 模块

例子

output 模块

例子1
output {
    # tdout { codec => "rubydebug" }
    # 筛选过滤后的内容输出到终端显示

    elasticsearch {  # 导出到es,最常用的插件
        codec => "json"
        # 导出格式为json
        hosts => ["127.0.0.1:9200"]
        # ES地址+端口
        index => "logstash-slow-%{+YYYY.MM.dd}"
        # 导出到index内,可以使用时间变量
        user => "admin"
        password => "xxxxxx"
        # ES如果有安全认证就使用账号密码验证,无安全认证就不需要
        flush_size => 500
        # 默认500,logstash一次性攒够500条的数据在向es发送
        idle_flush_time => 1
        # 默认1s,如果1s内没攒够500,还是会一次性把数据发给ES
    }   
}
例子2
output {
     redis{  # 输出到redis的插件,下面选项根据需求使用
         batch => true
         # 设为false,一次rpush,发一条数据,true为发送一批
         batch_events => 50
         # 一次rpush发送多少数据
         batch_timeout => 5
         # 一次rpush消耗多少时间
         codec => plain
         # 对输出数据进行codec,避免使用logstash的separate filter
         congestion_interval => 1
         # 多长时间进项一次拥塞检查
         congestion_threshold => 5
         # 限制一个list中可以存在多少个item,当数量足够时,就会阻塞直到有其他消费者消费list中的数据
         data_type => list
         # 使用list还是publish
         db => 0
         # 使用redis的那个数据库,默认为0号
         host => ["127.0.0.1:6379"]
         # redis 的地址和端口,会覆盖全局端口
         key => xxx
         # list或channel的名字
         password => xxx
         # redis的密码,默认不使用
         port => 6379
         # 全局端口,默认6379,如果host已指定,本条失效
         reconnect_interval => 1
         # 失败重连的间隔,默认为1s
         timeout => 5
         # 连接超时的时间
         workers => 1
         # 工作进程
     }
}

常用插件还有很多,更多的插件使用可以查看官方文档 
通过上面的介绍,我们大体知道了 logstash 的处理流程: 
input => filter => output 
接下来就看一完整的应用例子

完整的应用:

Elasticsearch slow-log
input {
    file {
        path => ["/var/log/elasticsearch/private_test_index_search_slowlog.log"]
        start_position => "beginning"
        ignore_older => 0
        # sincedb_path => "/dev/null"
        type => "elasticsearch_slow"
        }   
}

filter {
    grok {
        match =>  { "message" => "^\[(\d\d){1,2}-(?:0[1-9]|1[0-2])-(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])\s+(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5]?[0-9]|60)(?:[:.,][0-9]+)?)\]\[(TRACE|DEBUG|WARN\s|INFO\s)\]\[(?<io_type>[a-z\.]+)\]\s\[(?<node>[a-z0-9\-\.]+)\]\s\[(?<index>[A-Za-z0-9\.\_\-]+)\]\[\d+\]\s+took\[(?<took_time>[\.\d]+(ms|s|m))\]\,\s+took_millis\[(\d)+\]\,\s+types\[(?<types>([A-Za-z\_]+|[A-Za-z\_]*))\]\,\s+stats\[\]\,\s+search_type\[(?<search_type>[A-Z\_]+)\]\,\s+total_shards\[\d+\]\,\s+source\[(?<source>[\s\S]+)\]\,\s+extra_source\[[\s\S]*\]\,\s*$" }
        remove_field => ["message"]
        }   

    date {
        match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] 
        }   
    ruby {
        code => "event.timestamp.time.localtime"
        }   
    }

output {
     elasticsearch {
         codec => "json"
         hosts => ["127.0.0.1:9200"]
         index => "logstash-elasticsearch-slow-%{+YYYY.MM.dd}"
         user => "admin"
         password => "xxxx"
    }   

}
Mysql-slow log
input {
    file {
        path => "/var/lib/mysql/slow.log"
        start_position => "beginning"
        ignore_older => 0
        # sincedb_path => "/dev/null"
        type => "mysql-slow"
    }   
}
filter {
    if ([message] =~ "^(\/usr\/local|Tcp|Time)[\s\S]*") { drop {} }
    multiline {
        pattern => "^\#\s+Time\:\s+\d+\s+(0[1-9]|[12][0-9]|3[01]|[1-9])"
        negate => true
        what => "previous"
    }   
    grok {
        match => { "message" => "^\#\sTime\:\s+\d+\s+(?<datetime>%{TIME})\n+\#\s+User@Host\:\s+[A-Za-z0-9\_]+\[(?<mysql_user>[A-Za-z0-9\_]+)\]\s+@\s+(?<mysql_host>[A-Za-z0-9\_]+)\s+\[\]\n+\#\s+Query\_time\:\s+(?<query_time>[0-9\.]+)\s+Lock\_time\:\s+(?<lock_time>[0-9\.]+)\s+Rows\_sent\:\s+(?<rows_sent>\d+)\s+Rows\_examined\:\s+(?<rows_examined>\d+)(\n+|\n+use\s+(?<dbname>[A-Za-z0-9\_]+)\;\n+)SET\s+timestamp\=\d+\;\n+(?<slow_message>[\s\S]+)$"
   }   
        remove_field => ["message"]
   }   
    date {
        match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] 
    }   
    ruby {
        code => "event.timestamp.time.localtime"
    }   
}
output { 
    elasticsearch {
        codec => "json"
        hosts => ["127.0.0.1:9200"]
        index => "logstash-mysql-slow-%{+YYYY.MM.dd}"
        user => "admin"
        password => "xxxxx"
    }   
}
Nginx access.log

logstash 中内置 nginx 的正则,我们只要稍作修改就能使用 
将下面的内容写入到/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash- 
patterns-core-2.0.5/patterns/grok-patterns 文件中

X_FOR (%{IPV4}|-)

NGINXACCESS %{COMBINEDAPACHELOG} \"%{X_FOR:http_x_forwarded_for}\"

ERRORDATE %{YEAR}/%{MONTHNUM}/%{MONTHDAY} %{TIME}

NGINXERROR_ERROR %{ERRORDATE:timestamp}\s{1,}\[%{DATA:err_severity}\]\s{1,}(%{NUMBER:pid:int}#%{NUMBER}:\s{1,}\*%{NUMBER}|\*%{NUMBER}) %{DATA:err_message}(?:,\s{1,}client:\s{1,}(?<client_ip>%{IP}|%{HOSTNAME}))(?:,\s{1,}server:\s{1,}%{IPORHOST:server})(?:, request: %{QS:request})?(?:, host: %{QS:server_ip})?(?:, referrer:\"%{URI:referrer})?

NGINXERROR_OTHER %{ERRORDATE:timestamp}\s{1,}\[%{DATA:err_severity}\]\s{1,}%{GREEDYDATA:err_message}

之后的 log 配置文件如下

input {
    file {
    path => [ "/var/log/nginx/www-access.log" ]
    start_position => "beginning"
    # sincedb_path => "/dev/null"
    type => "nginx_access"
    }   
}
filter {
    grok {
         match => { "message" => "%{NGINXACCESS}"}
    }
    mutate {
        convert => [ "response","integer" ]
        convert => [ "bytes","integer" ]
    }
    date {
        match => [ "timestamp","dd/MMM/yyyy:HH:mm:ss Z"]
    }   
    ruby {
        code => "event.timestamp.time.localtime"
    }   
}
output {
    elasticsearch {
        codec => "json"
        hosts => ["127.0.0.1:9200"]
        index => "logstash-nginx-access-%{+YYYY.MM.dd}"
        user => "admin"
        password => "xxxx"
    }
}
Nginx error.log
input {
    file {
    path => [ "/var/log/nginx/www-error.log" ]
    start_position => "beginning"
    # sincedb_path => "/dev/null"
    type => "nginx_error"
    }
}
filter {
    grok {
        match => [
                   "message","%{NGINXERROR_ERROR}",
                   "message","%{NGINXERROR_OTHER}"
                 ]
    }   
    ruby {
        code => "event.timestamp.time.localtime"
    }   
     date {
         match => [ "timestamp","dd/MMM/yyyy:HH:mm:ss"]
     } 

}

output {
    elasticsearch {
        codec => "json"
        hosts => ["127.0.0.1:9200"]
        index => "logstash-nginx-error-%{+YYYY.MM.dd}"
        user => "admin"
        password => "xxxx"
    }   
}
PHP error.log
input {
    file {
        path => ["/var/log/php/error.log"]
        start_position => "beginning"
        # sincedb_path => "/dev/null"
        type => "php-fpm_error"
    }   
}

filter {
    multiline {
        pattern => "^\[(0[1-9]|[12][0-9]|3[01]|[1-9])\-%{MONTH}-%{YEAR}[\s\S]+"
        negate => true
        what => "previous"
    }   
    grok {
        match => { "message" => "^\[(?<timestamp>(0[1-9]|[12][0-9]|3[01]|[1-9])\-%{MONTH}-%{YEAR}\s+%{TIME}?)\s+[A-Za-z]+\/[A-Za-z]+\]\s+(?<category>(?:[A-Z]{3}\s+[A-Z]{1}[a-z]{5,7}|[A-Z]{3}\s+[A-Z]{1}[a-z\s]{9,11}))\:\s+(?<error_message>[\s\S]+$)" }

        remove_field => ["message"]
    }   

    date {
        match => ["timestamp","dd/MMM/yyyy:HH:mm:ss Z"] 
    }   

    ruby {
        code => "event.timestamp.time.localtime"
    }   

}

output {
    elasticsearch {
        codec => "json"
        hosts => ["127.0.0.1:9200"]
        index => "logstash-php-error-%{+YYYY.MM.dd}"
        user => "admin"
        password => "xxxxx"
    }   
}
Php-fpm slow-log
input {
    file {
        path => ["/var/log/php-fpm/www.slow.log"]
        start_position => "beginning"
        # sincedb_path => "/dev/null"
        type => "php-fpm_slow"
    }   
}

filter {
    multiline {
        pattern => "^$"
        negate => true
        what => "previous"
    }   
    grok {
        match => { "message" => "^\[(?<timestamp>(0[1-9]|[12][0-9]|3[01]|[1-9])\-%{MONTH}-%{YEAR}\s+%{TIME})\]\s+\[[a-z]{4}\s+(?<pool>[A-Za-z0-9]{1,8})\]\s+[a-z]{3}\s+(?<pid>\d{1,7})\n(?<slow_message>[\s\S]+$)" }

        remove_field => ["message"]
    }   

    date {
        match => ["timestamp","dd-MMM-yyyy:HH:mm:ss Z"] 
    }   

    ruby {
        code => "event.timestamp.time.localtime"
    }   

}

output {

    elasticsearch {
        codec => "json"
        hosts => ["127.0.0.1:9200"]
        index => "logstash-php-fpm-slow-%{+YYYY.MM.dd}"
        user => "admin"
        password => "xxxx"
    }   
}

log 解析配置文件统一放在/etc/logstash/conf.d 目录下,不过也可以任意放 
置,统一起来最好。 
在多个配置文件的时候,不能使用如下命令运行logstash:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/(或者有个*)
  • 1

这个命令会拼接配置文件,不会单个使用,会报错。 
如果有多个配置文件,就一个一个启动:

/opt/logstash/bin/logstash -f /etc/logstash/conf.d/nginx_error.conf
  • 1

但是这样也很麻烦,如果配置文件很多的情况下需要一个个来,并且启动 
速度还很慢,所以我写了一个测试脚本用来方便使用,仅供参考:

#!/bin/bash
conf_path=/etc/logstash/conf.d  
# /配置文件存放目录根据需求自己更改
conf_name=$( ls ${conf_path} ) 

case $1 in

start)
    echo "-----------please wait.----------"
    echo "The start-up process is too slow."
    for cf in ${conf_name}
    do  
        /opt/logstash/bin/logstash  -f $conf_path/$cf > /dev/null 2>&1 &
            if [ $? -ne 0 ];then
                echo 'The '${cf}' start-up failed.'
            fi
        sleep 20
    done
    echo "start-up success."
;;    
stop)
    ps -ef |grep logstash |grep -v grep > /dev/null 2>&1 
    if [ $? -eq 0 ];then
        ps -ef|grep logstash |grep -v grep |awk '{print $2}'|xargs  kill -9 > /dev/null 2>&1
        sleep 2
        echo "Stop success."
    fi  
;;
restart)
    ps -ef |grep logstash |grep -v grep 2>&1
    if [ $? -eq 0 ];then
        ps -ef|grep logstash |grep -v grep |awk '{print $2}'|xargs  kill -9 > /dev/null 2>&1
        sleep 3
        echo "Stop success."
    fi  
    echo "-----------please wait.----------"
    echo "The start-up process is too slow."
    for cf in ${conf_name}
    do  
        /opt/logstash/bin/logstash  -f $conf_path/$cf > /dev/null 2>&1 &
            if [ $? -ne 0 ];then
                echo 'The '${cf}' start-up failed.'
            fi
        sleep 10
    done 
    echo "start-up success."
;;
*)
    echo "Usage: "$0" {start|stop|restart|}"
    exit 1
esac

脚本的名字中不要包含 logstash,这里保存为 log_stash.sh 
使用./log_stash.sh (start|stop|restart) 来执行脚本

转载于:https://my.oschina.net/u/2550810/blog/1828750

<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、付费专栏及课程。

余额充值