Logstash JSON插件解析日志时出现Unexpected end-of-input in VALUE_STRING错误的原因排查
Logstash JSON解析报错:Unexpected end-of-input in VALUE_STRING 的根源分析
先还原下你的问题场景:
你有一条日志行:
{"code":200,"message":"ok","responseBody":{"token":"asdadqwrqwkjrqwejr"},"time":"4545425244"}
但用Logstash的JSON插件解析时,logstash-plain.log里抛出了错误:
exception=>#< "LogStash" ::Json::ParserError: Unexpected end-of-input in VALUE_STRING
这个报错的核心原因是Logstash接收到的JSON内容不完整,解析器在读取字符串值的过程中突然遇到了输入结束的位置,具体可能有这几个常见情况:
- 日志传输/写入时被截断拆分:你贴出来的日志是完整合法的JSON,但实际Logstash读取到的可能是不完整的片段——比如日志在写入文件时被中断、或者通过网络传输时丢包,导致某行JSON的字符串部分(比如
token的取值、message的内容)还没写完就被截断了,解析器自然会报错“字符串还没结束就到输入末尾”。 - 日志包含隐藏的特殊字符:有些日志生成时会混入不可见的控制字符、乱码或者不规范的换行符,表面看是完整的JSON,但这些特殊字符会干扰解析器的判断,让它误以为字符串还没结束,实际却已经到了日志末尾。
- Logstash输入配置没处理好多行日志:如果你的日志生成时偶尔会把单条JSON拆成多行(比如某些应用日志会自动换行),但你没有在Logstash的输入插件(比如
file输入)里配置multiline插件来合并这些多行内容,Logstash就会把每一行单独当作一条日志来解析,其中不完整的行就会触发这个报错。
你可以按这几个方向排查:
- 直接去Logstash读取的原始日志文件里,找到对应时间点的日志,确认是不是真的完整;
- 用
jq命令(或者本地的JSON校验工具)把有问题的日志行丢进去校验,看是否真的是合法JSON; - 检查Logstash的输入配置,确认是否需要配置多行合并规则来处理可能被拆分的JSON日志。
内容的提问来源于stack exchange,提问作者Ali farahzadi
相关产品推荐
相关产品推荐

