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包方式,其他系统大同小异。

  1. 从官网下载Logstash 8.x(和你的ES版本一致)
    wget https://artifacts.elastic.co/downloads/logstash/logstash-8.13.0-linux-x86_64.tar.gz
  2. 解压到目标目录
    tar -zxvf logstash-8.13.0-linux-x86_64.tar.gz -C /usr/local/
  3. 重命名方便后续操作
    mv /usr/local/logstash-8.13.0 /usr/local/logstash
  4. 验证安装是否成功
    /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
注意: Filter段可选,可以全删掉。但Input和Output是必填的,少一个Logstash启动直接报配置错误。我曾经因为调试时只写了input没写output,重启了两次才发现——Logstash启动日志里有个明确的“No output plugin defined”警告,当时没仔细看。

实战:测试本地日志输入输出

我们先用最简单的 stdin → stdout 跑通管道,然后再换成读文件。

测试1:键盘输入,屏幕输出

  1. 启动Logstash,指定刚才的配置文件:
    /usr/local/logstash/bin/logstash -f simple.conf
  2. 终端会停住,等你的输入。你随便打几个字:
    hello logstash
  3. 你会看到类似这样的输出:
    {
           "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核心工作流程

我把整个数据流画成了一张图,方便你理解数据是怎么流动的:

Logstash数据管道工作流 数据源 文件 / Beats / Syslog Input 插件 file / stdin / tcp Filter 插件 grok / mutate / date Output 插件 Elasticsearch / stdout 说明:整个管道是可选的——你不能没有Input和Output,但Filter可以留空。 每个阶段可以配置多个插件,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核心功能是否正常,不需要创建配置文件。我经常拿这个命令做“冒烟测试”。