ELK(一)Logstash

本文详细介绍Logstash的安装、配置及使用方法,包括input、filter、output各阶段的配置技巧,如file插件、grok正则解析、GeoIP查询等。

关于ELK的历史跟作用在此就不说了,相信网上很多,大家都能够搜到,在此我说下他们的安装及使用。

一、logstash的下载及安装

下载:wget https://artifacts.elastic.co/downloads/logstash/logstash-5.2.2.tar.gz

解压: tar –vzxf logstash-5.2.2.tar.gz

bin/logstash –f logstash.cnf

进行运行logstash.conf 配置文件里面的设置

长期运行:一句话就可以搞定,如果想让某命令在后台长期运行,需要在命令前加 nohup,后面加 &

二、input配置

file插件

在logstash中可以在input里面添加file配置,默认的最小化配置如下:

input {
    file {
        path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/*"
    }
}
filter {
}
output {
    stdout {}
}
注意:文件路径名用绝对路径,并且支持globs写法。

file插件还有一些其他的属性。

file {
        #监听文件的路径
        path => ["E:/software/logstash-1.5.4/logstash-1.5.4/data/*","F:/test.txt"]
        #排除不想监听的文件
        exclude => "1.log"
        #添加自定义的字段(在输出结果中增加一个字段)
        add_field => {"test"=>"test"}
        #增加标签
        tags => "tag1"
        #设置新事件的标志
        delimiter => "\n"
        #设置多长时间扫描目录,发现新文件
        discover_interval => 15
        #设置多长时间检测文件是否修改
        stat_interval => 1
         #监听文件的起始位置,默认是end
        start_position => beginning
        #监听文件读取信息记录的位置
        sincedb_path => "E:/software/logstash-1.5.4/logstash-1.5.4/test.txt"
        #设置多长时间会写入读取的位置信息
        sincedb_write_interval => 15
    }

其中input常用的输入源有:file,syslog,redis,log4j,apache log或nginx log等等

三、codec配置

如果事件数据是json格式,可以加入codec=>json来进行解析
output{
stdout{
codec=>json
codec=>json_lines{#如果你的json文件比较长,需要换行那么就得用到json_lines的编码方式了
}
}

multiline多行事件编码 
有时候有的日志会用很多行去展现,这么多行其实都是一个事件。比如JAVA的异常日志

input{
stdin{
codec=>multiline{
charset=>...#字符编码,可选
max_bytes=>#bytes类型,设置最大的字节数,可选
max_lines=>#number类型,设置最大的行数,默认是500行,可选
multiline_tag=>#string类型,设置一个事件标签,默认是"multiline",可选
pattern=>...#string类型,设置匹配的正则表达式,必选
patterns_dir=>...#array类型,可以设置多个正则表达式,可选
negate=>...#boolean类型,设置正向匹配还是反向匹配,默认是false,可选
what=>...#设置未匹配的内容是向前合并还是向后合并,previous,next两个值选择,必选
}
}
}

四、filter配置

Grok正则

使用grok filter需要在logstash的配置文件中加上这样的内容:
filter {
    grok {
        match => { "message" => "grok_pattern" }
    }
}

这段代码中除了grok_pattern以外都是logstash的关键字。grok_pattern部分需要使用者填充自己的解析方式。

grok_pattern由零个或多个%{SYNTAX:SEMANTIC}组成,其中SYNTAX是表达式的名字,是由grok提供的,例如数字表达式的名字是NUMBER,IP地址表达式的名字是IP。SEMANTIC表示解析出来的这个字符的名字,由自己定义,例如IP字段的名字可以是client。

对于下面的这条日志

55.3.244.1 GET /index.html 15824 0.043

可以这样解析

* client: 55.3.244.1
* method: GET
* request: /index.html
* bytes: 15824
* duration: 0.043

Date插件

filter {
    grok {
        match => ["message", "%{HTTPDATE:logdate}"]
    }
    date {
        match => ["logdate", "dd/MMM/yyyy:HH:mm:ss Z"]
    }
}

数据修改( Mutate)

类型转换是 filters/mutate 插件最初诞生时的唯一功能。可以设置的转换类型包括:"integer""float" "string"。示例如下:

filter {
    mutate {
        convert => ["request_time", "float"]
    }
}

字符串处理:

Split分割

filter {
    mutate {
        split => ["message", "|"]
    }
}

Join 仅对数组类型字段有效

我们在之前已经用 split 割切的基础再 join 回去。配置改成:

filter {

    mutate {

        split => ["message","|"]

    }

    mutate {

        join => ["message",","]

    }

}

merge

合并两个数组或者哈希字段。依然在之前 split 的基础上继续:

filter {

    mutate {

        split => ["message","|"]

    }

    mutate {

        merge => ["message","message"]

    }

}

Merge会将所有的装进一个数组里面

如果 src 字段是字符串,会自动先转换成一个单元素的数组再合并。

GEOIP地址查询归类

filter {

    geoip {

        source => "message"

    }

}

运行结果:

{

       "message" => "183.60.92.253",

      "@version" => "1",

    "@timestamp" => "2014-08-07T10:32:55.610Z",

          "host" => "raochenlindeMacBook-Air.local",

         "geoip" => {

                      "ip" => "183.60.92.253",

           "country_code2" => "CN",

           "country_code3" => "CHN",

            "country_name" => "China",

          "continent_code" => "AS",

             "region_name" => "30",

               "city_name" => "Guangzhou",

                "latitude" => 23.11670000000001,

               "longitude" => 113.25,

                "timezone" => "Asia/Chongqing",

        "real_region_name" => "Guangdong",

                "location" => [

            [0] 113.25,

            [1] 23.11670000000001

        ]

    }

}

GeoIP 库数据较多,如果你不需要这么多内容,可以通过 fields 选项指定自己所需要的。下例为全部可选内容:

filter {

    geoip {

        fields => ["city_name","continent_code", "country_code2","country_code3", "country_name", "dma_code","ip", "latitude", "longitude","postal_code", "region_name", "timezone"]

    }

}

Split拆分事件:

filter {

    split {

        field => "message"

        terminator => "#"

    }

}

会分割成n个事件。

注意:split拆分事件后会直接进入到output阶段,所有的split后的其他插件都不可以用了。

output配置

标准输出:

output {

    stdout {

        codec => rubydebug

        workers => 2

    }

}

保存到文件:

output {

    file {

        path =>"/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz"

        message_format =>"%{message}"

        gzip => true

    }

}

输出到elasticsearch

output {

    elasticsearch {

        host => "192.168.0.2"

        protocol => "http"

        index =>"logstash-%{type}-%{+YYYY.MM.dd}"

        index_type => "%{type}"

        workers => 5

        template_overwrite => true

    }

}

输出到redis

input {stdin {} }

output {

    redis {

        data_type => "channel"

        key =>"logstash-chan-%{+yyyy.MM.dd}"

    }

}



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

余额充值