第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规则来降低延迟的。
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)
- 知道常用的插件和避坑点
- 会启动、测试、查日志