Nginx calculou variáveis ​​​​de log usando lua

Nginx calculou variáveis ​​​​de log usando lua

Estou tentando fazer com que o Nginx (executando como um controlador de entrada do Kubernetes) faça login em milissegundos em vez de segundos. (Isso é para que possamos ingerir os logs em nosso sistema Elasticsearch existente, que já possui outros sistemas registrando em ms)

Com base nissopostagem no blogEu tentei o seguinte no contexto 'http':

  map $host $request_time_ms {
    default 'test';
  }
  log_by_lua_block { 
    ngx.var.request_time_ms = 'foo'
  }

E então na minha string de log:

 '{...."duration_ms":"$request_time_ms",....}'

Mas o valor registrado é sempre o valor padrão testem vez do valor esperado de foo.

No final das contas, deve acabar assim:

ngx.var.request_time_ms = math.floor(tonumber(ngx.var.request_time) * 1000)

Mas estou apenas tentando fazer com que a situação básica funcione primeiro.

Alguma idéia de por que isso não funciona? É como se o log_by_lua_blockjust não estivesse funcionando.

Responder1

Não consigo reproduzir sua situação em meu próprio servidor (preciso dizer que não uso kubernetes ou docker para testes). Para mim, essa configuração funciona conforme o esperado. Realmente parece que log_by_lua_blocknão está funcionando no seu controlador de entrada. Mas você pode usar a seguinte solução alternativa para obter o tempo de solicitação em milissegundos em vez de segundos:

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

informação relacionada