You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vector 0.17.0 Lua转换组件table转JSON时global 'json'为nil报错求助

报错原因
  • Vector 0.17.0版本的Lua v2 transform组件默认没有内置全局json工具库,直接调用json.encode()会因找不到对应的全局变量触发索引nil值的报错
  • 你配置中指定的search_dirs指向系统Lua库路径,但Vector的Lua运行环境是独立嵌入的,不会自动加载系统安装的json库,需手动引入或使用内置功能
解决方法

提供两种可直接落地的方案:

方案1:使用Vector内置编码函数(无额外依赖,优先推荐)

Vector Lua v2运行环境内置了全局encode_json函数,直接传入event对象即可返回JSON字符串,无需引入第三方库,修改后的完整配置如下:

[transforms.cut_field]
type = "lua"
inputs = ["log_source"]
version = "2"
source = """
function hook_process(event, emit)
    -- 空事件判断提前,避免后续调用next触发报错
    if event == nil then
        print("event is nil")
        return
    end
    if next(event) == nil then
        print("event empty")
    end
    local str = encode_json(event)
    print(str)
    emit(event)
end
"""
hooks.process = "hook_process"

方案2:手动引入第三方dkjson库

如果需要自定义JSON编码逻辑,可以引入纯Lua实现的无依赖dkjson库:

  1. 下载dkjson.lua文件放入你配置的/usr/lib64/lua目录下
  2. 在Lua代码开头手动引入库即可正常调用json.encode,修改后的配置如下:
[transforms.cut_field]
type = "lua"
inputs = ["log_source"]
version = "2"
search_dirs = [ "/usr/lib64/lua" ]
source = """
local json = require("dkjson")

function hook_process(event, emit)
    if event == nil then
        print("event is nil")
        return
    end
    if next(event) == nil then
        print("event empty")
    end
    -- 注意需先把event代理对象转为原生Lua表再编码,示例如下(根据实际字段调整)
    local event_table = {
        log = event.log,
        timestamp = event.timestamp
    }
    local str = json.encode(event_table)
    print(str)
    emit(event)
end
"""
hooks.process = "hook_process"

注意:Vector传入的event是代理对象不是原生Lua表,直接传入第三方json库编码会得到异常结果,需要先提取字段到原生表中再编码。

内容的提问来源于stack exchange,提问作者match zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:06:00