elk之logstash

环境:

centos7

jdk8

1.创建Logstash源

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
touch /etc/yum.repos.d/logstash.repo
vi /etc/yum.repos.d/logstash.repo
[logstash-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

 

2.使用yum安装logstash

yum makecache
yum install logstash -y

3.利用 log4j 搜集日志

a.pom.xml 引入

<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.9</version>
            <scope>provided</scope>
        </dependency>

b.log4j.properties添加

log4j.rootLogger = debug, socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=5044
log4j.appender.socket.RemoteHost=192.168.158.128
log4j.appender.socket.layout = org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern = %d [%t] %-5p %c - %m%n

c.在logstash服务器上添加配置 log4j-to-es.conf

output 是输出到elasticsearch,可翻阅前面的文章 elk之elasticsearch安装

input {log4j {type => "log4j-json" port => 5044}}

output {
                elasticsearch {
                action => "index" 
                hosts  => "192.168.158.128:9200" 
                index  => "applog"
                }
        }

然后重启 logstash ,打开kibana 指定 index or pattern 为我们这里配置的 applog,设置搜索时间就可以查看到日志了

 

4.利用logback 搜集日志

 a.pom.xml 引入

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>4.6</version>
</dependency>

b.配置logback.xml,添加appender

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 文件输出格式 -->
    <property name="PATTERN"
        value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{50} - %msg%n" />
    <!-- test文件路径 -->
    <property name="LOG_HOME" value="C:/Users/Administrator/Desktop/logs" />

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>${PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- logstash 收集日志 -->
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.158.128:5044</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <!-- 按照每天生成日志文件 -->
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名 -->
            <FileNamePattern>${LOG_HOME}/yun.%d{yyyyMMdd}.log
            </FileNamePattern>
            <!--日志文件保留天数 -->
            <!-- <MaxHistory>30</MaxHistory> -->
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
            <pattern>${PATTERN}</pattern>
        </encoder>
        <!--日志文件最大的大小 -->
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>500MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

     <logger name="org.springframework.web" level="DEBUG" additivity="false">  
        <appender-ref ref="STDOUT" />
    </logger>  
    
     <logger name="druid.sql" level="DEBUG" additivity="false">  
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="stash" />
    </logger>  
     <logger name="com.yun" level="DEBUG" additivity="false">  
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="stash" />
    </logger>  
    
    <!-- 日志输出级别 -->
    <root level="DEBUG">
        <appender-ref ref="FILE" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="stash" />
    </root>
</configuration>

c.logstash服务器上添加配置  logback-to-es.conf

input {tcp {port => 5044 codec => "json_lines"}}
output {
                elasticsearch {
                action => "index" 
                hosts  => "192.168.158.128:9200" 
                index  => "applog"
                }
        }

 

配置目录请认准 /etc/logstash/conf.d 

可以打开 logstash.yml 查看 cat /etc/logstash/logstash.yml 

d.重启logstash,启动项目产生日志,然后去kibana 查看日志

 

5.利用filebeat搜集日志

 

转载于:https://www.cnblogs.com/yun965861480/p/7280536.html

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

余额充值