
私は、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;
}