Nginx日志记录:是否有一种方法可以以毫秒为单位记录自Unix纪元以来的请求时间?

我知道$msec logging parameter,它以毫秒为粒度给出了请求时间,从Unix纪元开始计算的秒数。然而,这个格式包含一个句点'.',例如'1407233265.472',这对于我正在使用的导入函数来解析日志文件是个问题。 有没有一种方法(日志参数或插件)可以让请求时间以总毫秒数记录?例如'1407233265472'。我愿意根据需要编译nginx。

4在使用非标准(即不来自发行版仓库)的网络服务器之前,我建议您在将日志导入工具之前通过sed进行处理。 - Sven
2个回答

有两种方法可以实现这个目标。第一种方法比较粗糙,我不建议使用,但它是最快的方式:
if ($msec ~ "(.*)\.(.*)") {
    set $epoch_millis = "$1$2"
}
这个更干净,但需要使用lua。
set_by_lua_block $epoch_millis { return string.gsub(ngx.var.msec, "%.", "") }
然后只需记录$epoch_millis

1当值为1407233265.4时会发生什么?计算结果将是14072332654,这是一个错误的答案。 - sanigo
2Nginx会用零填充小数点,因此不会输出多于或少于3位小数。 - xref

扩展Sirk的答案,您还可以使用地图将10.3毫秒格式转换为没有小数点的13位毫秒纪元格式。
map $msec $msec_no_decimal { ~(.*)\.(.*) $1$2; }
具体来说,我需要将这张地图放在nginx.conf的http { ... }块中,因为DataDog不会自动解析10.3格式,但会解析13位数字格式。 (为了解决sanigo的担忧;nginx会在小数点后面填充零,所以这将始终转换为13位数字。)