Logstash 故障排除

编辑

安装和设置

编辑

临时目录不可访问

编辑

某些版本的 JRuby 运行时和某些插件中的库(例如,TCP 输入中的 Netty 网络库)会将可执行文件复制到临时目录。当 /tmpnoexec 方式挂载时,这种情况会导致后续失败。

示例错误

[2018-03-25T12:23:01,149][ERROR][org.logstash.Logstash ]
java.lang.IllegalStateException: org.jruby.exceptions.RaiseException:
(LoadError) Could not load FFI Provider: (NotImplementedError) FFI not
available: java.lang.UnsatisfiedLinkError: /tmp/jffi5534463206038012403.so:
/tmp/jffi5534463206038012403.so: failed to map segment from shared object:
Operation not permitted

可能的解决方案

  • 更改设置以 exec 方式挂载 /tmp
  • jvm.options 文件中使用 -Djava.io.tmpdir 设置指定备用目录。

Logstash 启动

编辑

非法反射访问 错误

编辑

升级后,Logstash 可能会显示类似以下的警告

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jruby.ext.openssl.SecurityHelper (file:/{...}/jruby{...}jopenssl.jar) to field java.security.MessageDigest.provider
WARNING: Please consider reporting this to the maintainers of org.jruby.ext.openssl.SecurityHelper
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

这些错误似乎与JRuby 的已知问题相关。

解决方法

尝试将这些值添加到 jvm.options 文件。

--add-opens=java.base/java.security=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.base/java.nio.channels=ALL-UNNAMED
--add-opens=java.base/sun.nio.ch=org.ALL-UNNAMED
--add-opens=java.management/sun.management=ALL-UNNAMED

备注

  • 这些设置允许 Logstash 在不显示警告的情况下启动。
  • 此解决方法已在简单的管道中进行了测试。如果您有经验可以分享,请在此问题中发表评论。

Windows 上的权限被拒绝 - NUL 错误

编辑

在 Windows 上,Logstash 可能无法与某些用户提供的 JDK 版本一起启动。

示例错误

[FATAL] 2022-04-27 15:13:16.650 [main] Logstash - Logstash stopped processing because of an error: (EACCES) Permission denied - NUL
org.jruby.exceptions.SystemCallError: (EACCES) Permission denied - NUL

此错误似乎与JDK 问题相关,其中添加了一个具有不适当默认值的新属性。

此问题影响 Windows 上某些基于 OpenJDK 的 JVM 版本(Adoptium、OpenJDK 和 Azul Zulu)

  • 11.0.15+10
  • 17.0.3+7

解决方法

  • 使用 Logstash 附带的捆绑 JDK
  • 或者,尝试将此值添加到 jvm.options 文件,然后重新启动 Logstash

    -Djdk.io.File.enableADS=true

持久队列故障排除

编辑

持久队列问题的症状包括 Logstash 或一个或多个管道无法成功启动,并伴有类似于此的错误消息。

message=>"java.io.IOException: Page file size is too small to hold elements"

有关解决持久队列问题的更多信息,请参阅持久队列部分中的故障排除信息

数据摄取

编辑

错误响应代码 429

编辑

429 消息表示应用程序正忙于处理其他请求。例如,Elasticsearch 发送 429 代码来通知 Logstash(或其他索引器)批量操作失败,因为摄取队列已满。Logstash 将重试发送文档。

可能的措施

检查 Elasticsearch 是否需要处理。

示例错误

[2018-08-21T20:05:36,111][INFO ][logstash.outputs.elasticsearch] retrying
failed action with response code: 429
({"type"=>"es_rejected_execution_exception", "reason"=>"rejected execution of
org.elasticsearch.transport.TransportService$7@85be457 on
EsThreadPoolExecutor[bulk, queue capacity = 200,
org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@538c9d8a[Running,
pool size = 16, active threads = 16, queued tasks = 200, completed tasks =
685]]"})

性能

编辑

有关常规性能调整提示和指南,请参阅性能调整

管道故障排除

编辑

根据定义,管道是唯一的。以下是一些可帮助您入门的指南。

  • 确定有问题的管道。
  • 从小处着手。创建一个能体现问题的最小管道。

对于基本管道,此配置足以使问题显现。

input {stdin{}} output {stdout{}}

Logstash 可以按管道分离日志。此功能可以帮助您确定有问题的管道。在您的 logstash.yml 中设置 pipeline.separate_logs: true 以启用每个管道的日志记录功能。

对于更复杂的管道,问题可能是由特定顺序的一系列插件引起的。对这些管道的故障排除通常需要反复试验。首先系统地删除输入和输出插件,直到只剩下能体现问题的最小集合。

我们希望扩展此部分以使其更有用。如果您有故障排除技巧可以分享,请

日志级别会影响性能

编辑

症状

简单的过滤器,例如 mutatejson 过滤器,每个事件的执行时间可能需要几毫秒。输入和输出也可能受到影响。

背景

如果日志级别设置为 debugtrace,则 Logstash 上运行的不同插件可能非常冗长。由于 Logstash 中使用的日志记录库是同步的,因此繁重的日志记录会影响性能。

解决方案

将日志级别重置为 info

JSON 格式的日志记录可能会写入重复的 message 字段

编辑

症状

当日志格式为 json 并且某些日志事件(例如 JSON 编解码器插件的错误)包含 message 字段的两个实例时。

如果不设置此标志,JSON 日志将包含如下所示的对象

{
   "level":"WARN",
   "loggerName":"logstash.codecs.jsonlines",
   "timeMillis":1712937761955,
   "thread":"[main]<stdin",
   "logEvent":{
      "message":"JSON parse error, original data now in message field",
      "message":"Unexpected close marker '}': expected ']' (for Array starting at [Source: (String)\"{\"name\": [}\"; line: 1, column: 10])\n at [Source: (String)\"{\"name\": [}\"; line: 1, column: 12]",
      "exception":"LogStash::Json::ParserError",
      "data":"{\"name\": [}"
   }
}

请注意 message 字段的重复,虽然在技术上是有效的 JSON,但并不总是被正确解析。

解决方案config/logstash.yml 中启用严格的 JSON 标志

log.format.json.fix_duplicate_message_fields: true

或传递命令行开关

bin/logstash --log.format.json.fix_duplicate_message_fields true

启用 log.format.json.fix_duplicate_message_fields 后,message 字段的重复将被删除,并在字段名称中添加 _1 后缀

{
   "level":"WARN",
   "loggerName":"logstash.codecs.jsonlines",
   "timeMillis":1712937629789,
   "thread":"[main]<stdin",
   "logEvent":{
      "message":"JSON parse error, original data now in message field",
      "message_1":"Unexpected close marker '}': expected ']' (for Array starting at [Source: (String)\"{\"name\": [}\"; line: 1, column: 10])\n at [Source: (String)\"{\"name\": [}\"; line: 1, column: 12]",
      "exception":"LogStash::Json::ParserError",
      "data":"{\"name\": [}"
   }
}