Logstash 故障排除
编辑Logstash 故障排除
编辑安装和设置
编辑无法访问的临时目录
编辑某些版本的 JRuby 运行时和某些插件中的库(例如,TCP 输入中的 Netty 网络库)会将可执行文件复制到临时目录。当 /tmp
挂载为 noexec
时,此情况会导致后续失败。
示例错误
[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 可能由于 JDK 中的错误而无法启动。
示例错误
[FATAL] 2024-11-11 11:11:11.465 [LogStash::Runner] runner - An unexpected error occurred! {:error=>#<Java::JavaLang::NullPointerException: >, :backtrace=>[ "java.util.Objects.requireNonNull(java/util/Objects.java:233)", "sun.nio.fs.UnixFileSystem.getPath(sun/nio/fs/UnixFileSystem.java:296)", "java.nio.file.Path.of(java/nio/file/Path.java:148)", "java.nio.file.Paths.get(java/nio/file/Paths.java:69)", "jdk.internal.platform.CgroupUtil.lambda$readStringValue$1(jdk/internal/platform/CgroupUtil.java:67)", "java.security.AccessController.doPrivileged(java/security/AccessController.java:571)", "jdk.internal.platform.CgroupUtil.readStringValue(jdk/internal/platform/CgroupUtil.java:69)", "jdk.internal.platform.CgroupSubsystemController.getStringValue(jdk/internal/platform/CgroupSubsystemController.java:65)", "jdk.internal.platform.cgroupv1.CgroupV1Subsystem.getCpuSetCpus(jdk/internal/platform/cgroupv1/CgroupV1Subsystem.java:275)", "jdk.internal.platform.CgroupMetrics.getCpuSetCpus(jdk/internal/platform/CgroupMetrics.java:100)", "com.sun.management.internal.OperatingSystemImpl.isCpuSetSameAsHostCpuSet(com/sun/management/internal/OperatingSystemImpl.java:277)", "com.sun.management.internal.OperatingSystemImpl$ContainerCpuTicks.getContainerCpuLoad(com/sun/management/internal/OperatingSystemImpl.java:96)", "com.sun.management.internal.OperatingSystemImpl.getProcessCpuLoad(com/sun/management/internal/OperatingSystemImpl.java:271)", "org.logstash.instrument.monitors.ProcessMonitor$Report.<init>(org/logstash/instrument/monitors/ProcessMonitor.java:63)", "org.logstash.instrument.monitors.ProcessMonitor.detect(org/logstash/instrument/monitors/ProcessMonitor.java:136)", "org.logstash.instrument.reports.ProcessReport.generate(org/logstash/instrument/reports/ProcessReport.java:35)", "jdk.internal.reflect.DirectMethodHandleAccessor.invoke(jdk/internal/reflect/DirectMethodHandleAccessor.java:103)", "java.lang.reflect.Method.invoke(java/lang/reflect/Method.java:580)", "org.jruby.javasupport.JavaMethod.invokeDirectWithExceptionHandling(org/jruby/javasupport/JavaMethod.java:300)", "org.jruby.javasupport.JavaMethod.invokeStaticDirect(org/jruby/javasupport/JavaMethod.java:222)", "RUBY.collect_process_metrics(/usr/share/logstash/logstash-core/lib/logstash/instrument/periodic_poller/jvm.rb:102)", "RUBY.collect(/usr/share/logstash/logstash-core/lib/logstash/instrument/periodic_poller/jvm.rb:73)", "RUBY.start(/usr/share/logstash/logstash-core/lib/logstash/instrument/periodic_poller/base.rb:72)", "org.jruby.RubySymbol$SymbolProcBody.yieldSpecific(org/jruby/RubySymbol.java:1541)", "org.jruby.RubySymbol$SymbolProcBody.doYield(org/jruby/RubySymbol.java:1534)", "org.jruby.RubyArray.collectArray(org/jruby/RubyArray.java:2770)", "org.jruby.RubyArray.map(org/jruby/RubyArray.java:2803)", "org.jruby.RubyArray$INVOKER$i$0$0$map.call(org/jruby/RubyArray$INVOKER$i$0$0$map.gen)", "RUBY.start(/usr/share/logstash/logstash-core/lib/logstash/instrument/periodic_pollers.rb:41)", "RUBY.configure_metrics_collectors(/usr/share/logstash/logstash-core/lib/logstash/agent.rb:477)", "RUBY.initialize(/usr/share/logstash/logstash-core/lib/logstash/agent.rb:88)", "org.jruby.RubyClass.new(org/jruby/RubyClass.java:949)", "org.jruby.RubyClass$INVOKER$i$newInstance.call(org/jruby/RubyClass$INVOKER$i$newInstance.gen)", "RUBY.create_agent(/usr/share/logstash/logstash-core/lib/logstash/runner.rb:552)", "RUBY.execute(/usr/share/logstash/logstash-core/lib/logstash/runner.rb:434)", "RUBY.run(/usr/share/logstash/vendor/bundle/jruby/3.1.0/gems/clamp-1.0.1/lib/clamp/command.rb:68)", "RUBY.run(/usr/share/logstash/logstash-core/lib/logstash/runner.rb:293)", "RUBY.run(/usr/share/logstash/vendor/bundle/jruby/3.1.0/gems/clamp-1.0.1/lib/clamp/command.rb:133)", "usr.share.logstash.lib.bootstrap.environment.<main>(/usr/share/logstash/lib/bootstrap/environment.rb:89)", "usr.share.logstash.lib.bootstrap.environment.run(usr/share/logstash/lib/bootstrap//usr/share/logstash/lib/bootstrap/environment.rb)", "java.lang.invoke.MethodHandle.invokeWithArguments(java/lang/invoke/MethodHandle.java:733)", "org.jruby.Ruby.runScript(org/jruby/Ruby.java:1245)", "org.jruby.Ruby.runNormally(org/jruby/Ruby.java:1157)", "org.jruby.Ruby.runFromMain(org/jruby/Ruby.java:983)", "org.logstash.Logstash.run(org/logstash/Logstash.java:163)", "org.logstash.Logstash.main(org/logstash/Logstash.java:73)" ] } [FATAL] 2024-11-11 11:11:11.516 [LogStash::Runner] Logstash - Logstash stopped processing because of an error: (SystemExit) exit org.jruby.exceptions.SystemExit: (SystemExit) exit at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java: 921) ~[jruby.jar:?] at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java: 880) ~[jruby.jar:?] at usr.share.logstash.lib.bootstrap.environment.<main>(/usr/share/logstash/lib/bootstrap/environment.rb: 90) ~[?:?]
当未启用 cgroups v2 时(例如在 Red Hat 版本 8 操作系统上运行时),可能会发生此错误。
解决方法
请按照操作系统的说明启用 cgroups v2。
持久队列故障排除
编辑持久队列问题的症状包括 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
以启用每个管道的日志功能。
对于更复杂的管道,问题可能由特定顺序的一系列插件引起。对这些管道进行故障排除通常需要反复试验。首先,系统地删除输入和输出插件,直到剩下能够体现问题的最小集合。
我们希望扩展此部分以使其更有帮助。如果您有故障排除技巧要分享,请
- 在 https://github.com/elastic/logstash/issues 上创建问题,或
- 在 https://github.com/elastic/logstash 上创建包含您建议更改的拉取请求。
日志级别会影响性能
编辑症状
诸如 mutate
或 json
筛选器之类的简单筛选器,每个事件可能需要几毫秒才能执行。输入和输出也可能受到影响。
背景
如果日志级别设置为 debug
或 trace
,则在 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\": [}" } }