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 错误编辑

Logstash 可能无法在 Windows 上使用某些用户提供的 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\": [}"
   }
}