Nginx使用lua计算日志变量

Nginx使用lua计算日志变量

我正在尝试让 Nginx(作为 Kubernetes 入口控制器运行)以毫秒而不是秒为单位进行登录。(这样我们就可以将日志导入我们现有的 Elasticsearch 系统中,该系统中已经有其他以毫秒为单位进行登录的系统)

基于此博客文章我在“http”上下文中尝试了以下操作:

  map $host $request_time_ms {
    default 'test';
  }
  log_by_lua_block { 
    ngx.var.request_time_ms = 'foo'
  }

然后在我的日志字符串中:

 '{...."duration_ms":"$request_time_ms",....}'

但记录的值始终是的默认值,test而不是的预期值foo

最终结果应该是这样的:

ngx.var.request_time_ms = math.floor(tonumber(ngx.var.request_time) * 1000)

但我只是想先让基本情况正常运转。

知道为什么这不起作用吗?就好像它log_by_lua_block没有运行一样。

答案1

我无法在我自己的服务器上重现您的情况(需要说明的是,我没有使用 kubernetes 或 docker 进行测试)。对我来说,此配置按预期工作。它看起来确实log_by_lua_block没有在您的入口控制器上运行。但您可以使用以下解决方法以毫秒而不是秒为单位获取请求时间:

map $request_time $request_time_ms {
    ~^0\.0*(\d+?)$  $1;
    ~(\d+)\.(\d+)   $1$2;
}

相关内容