OpenResty中能否将Lua变量内容写入Nginx访问日志?
在Nginx中用Lua计算值并写入访问日志的解决办法
为啥之前的配置失效?
你遇到的未知变量错误,是因为Nginx要求所有在日志格式里引用的自定义变量,必须提前在请求上下文里声明。另外你示例里还有个笔误:应该是ngx.var.msec,不是nginx.var.msec。
之前用map或者set没成功,大概率是set放错了位置——如果把set放在http块,Nginx不会在请求流程里初始化这个变量,Lua赋值后也传不到日志里;而map是配置加载时就固定映射关系,没法在请求阶段通过Lua动态修改,自然没用。
正确的配置方式
要实现这个需求,核心是在server或location块提前用set初始化变量,然后在log_by_lua_block里赋值,这样日志就能正常读取变量值了。
完整配置示例
http { # 定义包含自定义变量的日志格式 log_format extended escape=json '{"timestamp_ns": "$lua_timestamp_ns", "remote_addr": "$remote_addr"}'; server { listen 80; # 关键:在server块提前初始化自定义变量,给空默认值 set $lua_timestamp_ns ""; location / { # 你的业务配置,比如静态文件或反向代理 root /usr/share/nginx/html; index index.html; # 请求结束阶段计算并赋值 log_by_lua_block { # 把毫秒时间转成纳秒(msec是带小数的毫秒,比如1718000000.456,乘1e6得纳秒) ngx.var.lua_timestamp_ns = ngx.var.msec * 1000000 } } # 指定用自定义格式记录访问日志 access_log /var/log/nginx/access.log extended; } }
注意点
set $lua_timestamp_ns "";必须放在server或location块,不能放http块,这样Nginx才会在每个请求上下文里创建这个变量。log_by_lua_block是请求处理的最后阶段执行,此时赋值的变量会被紧接着的access_log模块读取,时序上完全没问题。- 单位别搞错:
ngx.var.msec是毫秒级(含小数),乘以1000000才是纳秒,你之前乘1000得到的是微秒,可根据需求调整。
内容的提问来源于stack exchange,提问作者Konstantin Svintsov
相关产品推荐
相关产品推荐

