4、Logstash安装与配置:安装步骤,基本配置文件结构,测试本地日志输入输出
说实话,很多人在搭ELK的时候,第一步Elasticsearch和Kibana都能顺利跑起来,一到Logstash就开始各种报错。我见过不少同学卡在“配置文件语法”和“插件版本不兼容”上,一卡就是半天。其实Logstash没你想的那么复杂——它就是个管道,把数据吸进来,处理一下,再吐出去。今天咱们就把这管道接起来。
安装前的准备工作
Logstash依赖Java运行环境。我个人习惯用OpenJDK 11,生产环境踩过JDK 8的坑——有些高级插件在8上跑会莫名其妙丢数据。你装之前先确认一下:
- Linux / macOS / Windows 都支持,建议用Linux或macOS做实验
- JDK 11 以上(OpenJDK或Oracle JDK都行)
- 内存至少2G空闲,Logstash启动会吃掉大约1G
--memory 参数限制JVM堆大小,例如 -Xms512m -Xmx512m,省内存。
动手安装Logstash
安装很简单,我演示的是Linux上最常用的tar包方式,其他系统大同小异。
- 从官网下载Logstash 8.x(和你的ES版本一致)
wget https://artifacts.elastic.co/downloads/logstash/logstash-8.13.0-linux-x86_64.tar.gz - 解压到目标目录
tar -zxvf logstash-8.13.0-linux-x86_64.tar.gz -C /usr/local/ - 重命名方便后续操作
mv /usr/local/logstash-8.13.0 /usr/local/logstash - 验证安装是否成功
/usr/local/logstash/bin/logstash --version
我第一次装的时候忘了给解压目录加执行权限,结果 bin/logstash 脚本直接报 Permission denied。你如果遇到类似问题,记得 chmod +x 一下就好。
配置文件长啥样?
Logstash的配置文件本质上就是一个三段式流水线:Input → Filter → Output。你写的时候也是按这个顺序来。我习惯把每个阶段单独拆成一个文件或至少拆成清晰的块,方便以后换插件。
看一个最简单的完整配置:
# 文件:simple.conf
input {
stdin {}
}
filter {
# 这里可以什么都不写,Logstash默认会保留原始消息
# 如果你感兴趣,可以加一个 mutate 插件转一下字段名
}
output {
stdout {
codec => rubydebug
}
}
你想想看,这个配置做了什么?它从标准输入读数据,不做任何处理,然后以rubydebug格式(带字段解析的漂亮打印)输出到控制台。这就是“hello world”级别的Logstash。
配置文件结构详解
| 阶段 | 作用 | 常用插件举例 |
|---|---|---|
| input | 从哪里收集数据 | file, beats, tcp, syslog, kafka |
| filter | 数据清洗、解析、转换 | grok, mutate, date, geoip, dissect |
| output | 把处理后的数据发到哪里 | elasticsearch, stdout, file, kafka, s3 |
实战:测试本地日志输入输出
我们先用最简单的 stdin → stdout 跑通管道,然后再换成读文件。
测试1:键盘输入,屏幕输出
- 启动Logstash,指定刚才的配置文件:
/usr/local/logstash/bin/logstash -f simple.conf - 终端会停住,等你的输入。你随便打几个字:
hello logstash - 你会看到类似这样的输出:
{ "message" => "hello logstash", "@version" => "1", "@timestamp" => 2025-04-08T14:32:00.123Z, "host" => "your-hostname" }
看到这个结构了吗?Logstash自动帮你加了时间戳、主机名等元字段。这就是它的基本能力——把裸数据包装成结构化事件。
测试2:读取文件,输出到控制台
现在我们来处理真实的日志文件。假设你有一个 /var/log/test.log,里面有几行测试数据。创建一个新的配置文件 file-demo.conf:
input {
file {
path => "/var/log/test.log"
start_position => "beginning"
sincedb_path => "/dev/null" # 每次重新读,不记录偏移量
}
}
output {
stdout {
codec => rubydebug
}
}
启动方式一样,换一下配置文件:
/usr/local/logstash/bin/logstash -f file-demo.conf
你会看到test.log里的每一行都被解析成一个独立的事件,打印到终端。注意 sincedb_path => "/dev/null" 这句——我刚开始学的时候没加这个参数,每次重启Logstash它都不重新读文件,因为默认会记住上次读到的位置。测试时用 /dev/null 强迫它每次都从头读,很方便。
Logstash核心工作流程
我把整个数据流画成了一张图,方便你理解数据是怎么流动的:
避坑指南与调试技巧
Pipeline aborted due to error—— 配置文件语法错,检查逗号、花括号是否成对。我推荐用bin/logstash -f your.conf --config.test_and_exit做语法验证。Could not find a plugin named 'xxx'—— 拼写错误或未安装插件。Logstash 8自带大部分常用插件,但像kafka_input需要单独安装。- 端口冲突 —— 如果你用tcp input,端口被占用也会启动失败。
bin/logstash -e 'input{stdin{}} output{stdout{codec=>rubydebug}}' 可以快速验证Logstash核心功能是否正常,不需要创建配置文件。我经常拿这个命令做“冒烟测试”。