
Nginx(Kubernetes 수신 컨트롤러로 실행)가 초 단위가 아닌 밀리초 단위로 로그인하도록 하려고 합니다. (이는 이미 ms에 로그인하는 다른 시스템이 있는 기존 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;
}