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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:13:28