将总请求时间(以秒为单位)写入nginx访问日志,可能使用计算变量

dsekswqp  于 2023-01-20  发布在  Nginx
关注(0)|答案(3)|浏览(262)

我正在尝试修改我的nginx访问日志格式,以包括请求持续时间(秒)。
我可以使用两个变量:
1)$request_time
2)$upstream_response_time
但是这两个变量都是以微秒表示的,我需要这个值以秒表示。有没有办法将输出指定为表达式(即$request_time * 1000)或以其他方式完成此操作?
谢谢

ogq8wdun

ogq8wdun1#

网络服务器不是一个计算器或统计程序。它的记录功能是提供原始数据,你可以做你的分析。如果你的分析程序是不能转换微秒到秒,你应该货比三家,为其他软件。在任何情况下,这是不现实的期望一个程序的记录功能,以执行单位转换为您。记录的目的不是格式化,但却无法在不影响其核心功能性能的情况下记录所做的工作。

7rtdyuoh

7rtdyuoh2#

如果你使用LogStash(ELK堆栈)这样的报告器,你可以在解析日志时做一些计算。下面是我在Nginx的Logstash过滤器中将秒转换为毫秒的例子:

grok {
      match => {
        "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:logMessage} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:\"(?:%{URI:referrer}|-)\"|%{QS:referrer}) %{QS:agent} rt=%{NUMBER:duration_sec} cid=%{GREEDYDATA:correlationId}"
      }
}
mutate { convert => [ "duration_sec", "float" ] }
ruby { code => "event['duration_ms'] = event['duration_sec'].to_f * 1000" }

希望这个有用。

xam8gpfp

xam8gpfp3#

正如注解中所指出的,$request_time已经是以秒为单位,但是可以在nginx配置中完全转换为另一个单位,如下所示。
我知道这是一个老问题,但它似乎得到了很多流量,所以也许下面将帮助其他人谁,像我一样,可能想转换为一个不同的单位,在我的情况下纳秒(虽然如果你想毫秒,然后简单地省略6尾随零)。
这对于发送到Elastic event.duration字段很有用--为了避免Elastic端的摄取管道或类似操作(要乘以1000000),您可以改为执行一些可怕的正则表达式,如下所示。
$request_time总是用零填充到小数点后3位,这一点很有帮助,所以在常见情况下,您可以添加6个零-但您还必须处理前导零(小数点前后),以确保结果不会以任何前导零结束:

map $request_time $request_time_nanos {
    # Simple case for 0.000
    ~^0\.000$ 0;
    # If 0 before decimal place, must remove leading zeros after it, before adding 6 zeros
    ~^0\.(?:0*)([^0].*)$ $1000000;
    # Otherwise just concatenate the full pre- & post-decimal parts, before adding 6 zeros
    ~^([^0][^.]*)\.(.*)$ $1$2000000;
}

转换示例(插入逗号仅为便于阅读):

[sec]    [nanoseconds]
0.000 =>             0
0.110 =>   110,000,000
0.010 =>    10,000,000
1.010 => 1,010,000,000

相关问题