Nginx使用lua計算日誌變數

Nginx使用lua計算日誌變數

我試圖讓 Nginx(作為 Kubernetes 入口控制器運行)以毫秒而不是秒的速度登入。 (這樣我們就可以將日誌提取到我們現有的 Elasticsearch 系統中,該系統已經有其他系統在 ms 中登入)

基於此部落格文章我在“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;
}

相關內容