记docker部署logstash的一次报错

在Docker环境下部署Logstash时遇到容器频繁崩溃的问题,日志显示配置错误。经过检查,发现配置文件每行末尾有多余的空格,这是导致错误的原因。修复这些空格后,Logstash成功启动。此经验提醒我们在配置Logstash时,务必注意配置文件的格式整洁,避免因额外空格等细节问题引发错误。

一、报错与解决过程

docker run -d --name logstash -p 14560:4560 -v /root/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml -v /root/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:8.1.3

在docker上部署logstash的时候,刚把容器启动没一会儿就挂了,重启好几遍,还是会没一会就挂掉,查看日志发现以下信息:

“LogStash::ConfigurationError”, :message=>“Expected one of [ \t\r\n], “#”, “{”, “}” at line 3, column 21 (byte 37) after input {\n tcp {\n mode => “server””, :backtrace=>[“/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:32:in compile_imperative'", "org/logstash/execution/AbstractPipelineExt.java:189:in initialize’”, “org/logstash/execution/JavaBasePipelineExt.java:72:in initialize'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:47:in initialize’”, “/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:50:in execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:376:in block in converge_state’”]}

根据日志来看,报错的原因是配置文件出现了错误,仔细检查自己的配置文件,到底是没错啊,怎么就会报配置错误呢。

于是,按照日志信息的提示区配置文件的相应位置找问题,最终发现每个配置项的后面几乎都多了好几个空格,说多了都是泪啊😭😭😭。最终把多余的空格去掉后启动成功。
二、写在最后
重要的事情说三遍:logstash配置文件配置项末尾不要有空格!!! logstash配置文件配置项末尾不要有空格!!! logstash配置文件配置项末尾不要有空格!!!

Logstash 本身 **不会自动重启**,当它报错崩溃或被 OOM Killer 终止后,默认情况下将停止运行。因此,要实现“出错后自动重启”,你需要借助 **外部进程管理工具** 来监控 Logstash 进程并在其异常退出时重新启动。 --- ## ✅ 实现目标:Logstash 报错 → 自动重启 ### 核心方案: 使用系统级服务管理器(如 `systemd`)或容器编排平台(如 Docker + restart policy / Kubernetes)来实现 **崩溃自动拉起(auto-restart on failure)** --- ## ✅ 方案一:使用 systemd(推荐,适用于 Linux 生产环境) 这是最常见、最稳定的部署方式。 ### 步骤 1:创建 systemd service 文件 ```bash sudo vim /etc/systemd/system/logstash.service ``` ### 写入以下内容: ```ini [Unit] Description=Logstash Service Documentation=https://www.elastic.co/guide/en/logstash/current/ After=network.target [Service] Type=notify User=logstash Group=logstash Environment=LS_HOME=/usr/share/logstash Environment=LS_SETTINGS_DIR=/etc/logstash Environment=LS_LOG_DIR=/var/log/logstash Environment=LS_PID_DIR=/var/run/logstash # 启动命令(根据你的安装路径调整) ExecStart=/usr/share/logstash/bin/logstash --path.settings /etc/logstash # 崩溃后自动重启 Restart=always RestartSec=10 # 日志输出 StandardOutput=journal StandardError=journal # 资源限制 LimitNOFILE=65536 LimitNPROC=8192 TimeoutStopSec=60 [Install] WantedBy=multi-user.target ``` --- ### 步骤 2:启用并启动服务 ```bash # 重载 systemd 配置 sudo systemctl daemon-reexec sudo systemctl enable logstash # 启动服务 sudo systemctl start logstash # 查看状态 sudo systemctl status logstash ``` --- ### ✅ 关键参数说明 | 参数 | 作用 | |------|------| | `Restart=always` | 无论何种退出状态都重启 | | `Restart=on-failure` | 只有非正常退出(错误码 ≠ 0)才重启(更安全) | | `RestartSec=10` | 每次重启前等待 10 秒,防止频繁重启(防抖) | > 🔔 推荐生产环境使用 `Restart=on-failure`,避免配置错误导致无限重启风暴。 --- ### ✅ 如何验证自动重启? #### 手动杀死 Logstash 测试: ```bash sudo pkill -f logstash sleep 15 sudo systemctl status logstash ``` 你应该看到: - 状态从 `active (running)` → `failed` → 再次变为 `active (running)` - 日志中显示“Started Logstash Service”多次 --- ## ✅ 方案二:使用 Docker 实现自动重启 如果你用 Docker 运行 Logstash: ```yaml # docker-compose.yml version: '3' services: logstash: image: docker.elastic.co/logstash/logstash:8.11.0 container_name: logstash volumes: - ./pipelines.yml:/usr/share/logstash/pipeline/pipelines.yml - ./config/:/usr/share/logstash/config/ - logstash_data:/usr/share/logstash/data ports: - "5044:5044" # beats input - "9600:9600" # monitoring API environment: - "xpack.monitoring.enabled=false" restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9600"] interval: 30s timeout: 10s retries: 3 ``` ### `restart` 策略说明: | 策略 | 行为 | |------|------| | `no` | 不重启 | | `on-failure` | 失败时重启(可加次数限制) | | `always` | 总是重启(包括手动 stop) | | `unless-stopped` | 总是重启,除非手动 stop(推荐) | ✅ 推荐使用:`restart: unless-stopped` --- ## ✅ 方案三:Kubernetes 中的重启策略(Deployment) ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: logstash spec: replicas: 1 selector: matchLabels: app: logstash template: metadata: labels: app: logstash spec: containers: - name: logstash image: docker.elastic.co/logstash/logstash:8.11.0 ports: - containerPort: 5044 - containerPort: 9600 livenessProbe: httpGet: path: / port: 9600 initialDelaySeconds: 60 periodSeconds: 30 readinessProbe: httpGet: path: / port: 9600 initialDelaySeconds: 30 restartPolicy: Always # Pod 异常退出时自动重启 ``` 📌 注意:在 K8s 中,`restartPolicy: Always` 是默认值,适用于所有 Pod。 --- ## ✅ 如何让 Logstash 在某些错误下主动退出以便重启? 默认情况下,Logstash 出现大多数插件错误并不会退出进程(例如 Grok parse failure),而是继续运行。 如果你想让它在特定条件下“崩溃退出”,可以: ### 方法:使用 Ruby 插件触发 `exit(1)` ```ruby filter { if [some_critical_field] == "" { ruby { code => " event.tag('missing_critical_field') # 可选:录日志后退出 puts 'CRITICAL: Missing required field, exiting...' exit(1) " } } } ``` ⚠️ 使用需谨慎!会导致整个 pipeline 停止。 --- ## ✅ 监控 Logstash 是否频繁重启 ### 查看 systemd 日志中的重启录: ```bash journalctl -u logstash.service --since "1 hour ago" ``` 输出示例: ``` Mar 20 10:00:01 systemd[1]: Started Logstash Service. Mar 20 10:02:30 systemd[1]: logstash.service: Main process exited, code=exited, status=1/FAILURE Mar 20 10:02:40 systemd[1]: logstash.service: Scheduled restart job, restart counter is at 1. Mar 20 10:02:40 systemd[1]: Stopped Logstash Service. Mar 20 10:02:40 systemd[1]: Started Logstash Service. ``` 📌 如果发现短时间内重启多次(如每分钟一次),说明存在严重问题(配置错误、内存不足等),应立即排查。 --- ## ✅ 小结:如何做到“报错就重启” | 场景 | 实现方式 | |------|----------| | 物理机/虚拟机 | `systemd` + `Restart=on-failure` | | Docker | `restart: unless-stopped` | | Kubernetes | `restartPolicy: Always` + Liveness Probe | | 自定义脚本 | 使用 `while true; do logstash; sleep 10; done`(不推荐用于生产) | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值