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 を使用していないことは言うまでもありません)。私にとって、この構成は期待どおりに動作します。Ingresslog_by_lua_blockコントローラーではまったく実行されていないように見えます。ただし、次の回避策を使用して、リクエスト時間を秒単位ではなくミリ秒単位で取得できます。

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

関連情報