Nginx는 lua를 사용하여 로그 변수를 계산했습니다.

Nginx는 lua를 사용하여 로그 변수를 계산했습니다.

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;
}

관련 정보