我正在尝试让 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;
}