第3章:Logstash安装与基础配置

好了,进入正题。这一章咱们搞定Logstash——ELK里那个负责“吃数据”的家伙。说白了,它就是个管道,把各种来源的日志收进来,处理一下,再吐给Elasticsearch。我当年第一次搭审计日志平台的时候,就是卡在Logstash的配置上,后来发现其实套路很固定。

3.1 环境准备与安装

先说说环境。Logstash是Java写的,所以JDK是必须的。我个人习惯用OpenJDK 11,版本太老或太新都容易踩坑。比如我之前在CentOS 7上直接装了个JDK 8,结果Logstash 8.x启动时报了一堆Unsupported major.minor version错误。嗯,版本匹配很重要。

安装方式有几种:

  • yum/apt仓库安装(推荐,方便升级)
  • 直接下载tar.gz包(适合离线环境)
  • Docker镜像(适合容器化部署)

我一般用yum装,省事。先导入Elastic的GPG key和仓库:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

cat <<EOF | tee /etc/yum.repos.d/logstash.repo
[logstash-8.x]
name=Elastic repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

yum install logstash -y

验证安装:

/usr/share/logstash/bin/logstash --version

能看到版本号就对了。我见过有人装完忘了启动,用systemctl status logstash一看是inactive,还跑来找我排查——其实只是没enable服务。

3.2 核心配置文件结构

Logstash的配置,说白了就是定义一个管道。管道里三个环节:

配置段 作用 常见插件
input 从哪里读取数据 file, beats, syslog, kafka
filter 数据加工(不是必须的) grok, mutate, date, json
output 输出到哪里 elasticsearch, file, stdout

你想想看,这跟工厂流水线一样:原料进来(input),经过各种处理(filter),最后包装出货(output)。我在项目里遇到最多的问题是filter写得太重,导致处理延迟飙升。后来学乖了,尽量在input阶段就用codec做简单格式化。

3.3 第一个配置:从文件读日志,打印到控制台

我们先跑一个最简单的例子。创建一个配置文件/etc/logstash/conf.d/stdout-sample.conf:

input {
    file {
        path => "/var/log/secure"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

filter {
    # 先不加filter,看原始日志
}

output {
    stdout {
        codec => rubydebug
    }
}

注意那个sincedb_path => "/dev/null",这是我调试时的小技巧——每次重启都重新读文件,免得它记住位置跳过旧内容。生产环境千万别这么用,你会丢日志的。

启动Logstash测试:

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/stdout-sample.conf --config.test_and_exit

加上--config.test_and_exit可以检查语法。我记得有一次配置少了个逗号,肉眼扫了三遍都没发现,用这个参数一下就报错了。后来我把这步写进了CI里。

语法检查通过后,去掉--config.test_and_exit启动,就能在终端看到日志一行行解析出来的样子了。

核心逻辑流程:下面的SVG图描述了Logstash一次处理一条数据的基本过程。你会看到数据从input流入,经过filter(可选),最后到达output。我在实际优化性能时,就是通过减少filter中的grok规则来降低延迟的。

Logstash 管道工作流程 数据源 文件 / Beats / Syslog Input 插件 file / beats / syslog Filter 插件 grok / mutate / date Output 插件 ES / stdout / kafka 🔄 可选路径 Filter段可省略(直接输出原始数据) 数据从左到右流动,每一条事件依次经过这些阶段

3.4 基础插件和常用配置项

Logstash内置了很多插件,不过最常用也就那几个。我列出一些核心参数,很多新人容易搞混:

插件/配置项 说明 生产建议
input: file 读取本地文件,支持通配符 使用exclude => "*.gz"排除压缩文件
input: beats 接收Filebeat发送的数据 建议设置host => "0.0.0.0"并绑定端口5044
filter: grok 正则解析非结构化日志 尽量用预置模式,自定义模式注意性能
output: elasticsearch 写入ES索引 设置index => "audit-%{+YYYY.MM.dd}"按天分索引

调优技巧:我在处理Linux审计日志时,经常要解析type=USER_AUTH msg=audit这种格式。用grok写了个模式:type=%{WORD:audit_type} msg=audit\\(%{NUMBER:audit_id}:%{INT:seq}\\)。如果你不想造轮子,Logstash官方论坛有很多现成的审计日志模版可以抄。

3.5 启动与守护进程管理

测试没问题后,用systemd管理最方便:

systemctl start logstash
systemctl enable logstash
journalctl -u logstash -f   # 实时看日志

注意检查日志目录/var/log/logstash/logstash-plain.log,里面经常藏着错误线索。我曾经花了一下午排查一个无响应的Logstash,最后发现是磁盘空间满了,日志写不进去,但它没有正常报错,只是hang住了。

⚠️ 内存与JVM调优:Logstash默认JVM堆内存是1GB,如果你的服务器内存小于2GB,启动就会失败。我建议至少给到2GB(-Xms2g -Xmx2g)。修改方式:编辑/etc/logstash/jvm.options,别把机器搞死。

还有个坑:如果你用tar.gz包解压运行,别忘了安装插件。用bin/logstash-plugin install logstash-codec-json命令就行。我有个同事忘了装json codec,结果一直输出一行行乱码,他还以为日志本来就是加密的…

3.6 本章要点小结

到这,Logstash安装和基础配置就算搞定了。你手里的技能:

  • 会装Logstash(yum/tar/docker随便你)
  • 能写一个简单的管道配置(input→[filter]→output)
  • 知道常用的插件和避坑点
  • 会启动、测试、查日志