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库:
- 下载
dkjson.lua文件放入你配置的/usr/lib64/lua目录下 - 在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
相关产品推荐
相关产品推荐

